快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序)。然后以这个X在变换后数组的位置i分为左右两个子数组,再分别进行快速排序,直到子数组中只有一个元素为止。

快速排序算法如下

void quicksort(int A[], int p, int r)
{
    int i;
    if(p < r)
    {
        i = partition(A, p, r);
        quicksort(A, 0, i - 1);
        quicksort(A, i + 1, r);
    }   
}

其中partition函数将得到X所在的位置i(在这里总以数组的最后一个元素为轴)。

int partition(int A[], int p, int r)
{
    int i = p - 1, j;
    for(j = p; j < r; j++)
    {
        if(A[j] >= A[r])
        {
            i++;
            swap(&A[i], &A[j]);
        }
    }
    swap(&A[i + 1], &A[r]);
    return i + 1;
}

由于总是选择数组的最后一个元素做为轴,因此可能出现X的左边为n - 1或接近n - 1个元素,而右边没有元素,或元素很少的情况,即X最大或比较大。这样使quicksort将出现最坏的情况,也就是时间复杂度为O(n^2)。因此partition可以采用随机方式得到轴X的位置i。 这样它的平均情况是非常好的(时间复杂度为O(nlogn)),也就是说,最坏情况很难出现。

int new_random(int min, int max)
{
    return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
}

int randomize_partition(int A[], int p, int r)
{
    int i = new_random(p, r);
    swap(&A[i], &A[r]);
    return partition(A, p, r);
}

完整的代码如下

#include <stdio.h>
#include <stdlib.h>

void out_int_array(int data[], int n)
{
    int i;
    for(i = 0; i < n; i++)
    {
        printf("%d ", data[i]);
    }
    printf("\n");
}
void swap(int *a, int *b)
{
    int x;
    x = *a;
    *a = *b;
    *b = x;
}

int new_random(int min, int max)
{
    return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
}
int partition(int A[], int p, int r)
{
    int i = p - 1, j;
    for(j = p; j < r; j++)
    {
        if(A[j] >= A[r])
        {
            i++;
            swap(&A[i], &A[j]);
        }
    }
    swap(&A[i + 1], &A[r]);
    return i + 1;
}

void quicksort(int A[], int p, int r)
{
    int i;
    if(p < r)
    {
        i = partition(A, p, r);
        quicksort(A, 0, i - 1);
        quicksort(A, i + 1, r);
    }   
}

int randomize_partition(int A[], int p, int r)
{
    int i = new_random(p, r);
    swap(&A[i], &A[r]);
    return partition(A, p, r);
}

void randomize_quicksort(int A[], int p, int r)
{
    int i;
    if(p < r)
    {
        i = randomize_partition(A, p, r);
        quicksort(A, 0, i - 1);
        quicksort(A, i + 1, r);
    }   
}

int main()
{
    int A[] = {4, 1, 44, -12, 5, 125, 30};
    int B[] = {4, 1, 44, -12, 5, 125, 30};
    out_int_array(A, 7);
    quicksort(A, 0, 6);
    out_int_array(A, 7);
    printf("--------------------------randomize-----------------------------\n");   
    srand((unsigned)time( NULL ));
    randomize_quicksort(B, 0, 6);
    out_int_array(B, 7);
    return 0;
}

本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215359,如需转载请自行联系原作者

快速排序(quicksort)算法实现相关推荐

  1. 快速排序quicksort算法优化

    1.基本想想 快速排序使用分治的思想 通过一趟排序将待排序列分割成两部分,其中一部分所有元素均比基准大,另一部分均比基准小 分别对这两部分元素继续进行排序,以达到整个序列有序 2.快排的步骤 1.选择 ...

  2. 快速排序quicksort算法细节优化(一次申请内存/无额外内存排序)

    文章目录 1.只申请一次内存,避免多次递归调用时反复的申请和释放内存,提高程序运行效率 2.不申请内存,在原数组上直接排序 优化比较总结 对链接中快速排序进行代码优化 https://blog.csd ...

  3. quicksort算法_QuickSort算法–用C,Java,Python实现

    quicksort算法 介绍 (Introduction) Quicksort algorithm is one of the fastest internal sorting algorithms ...

  4. 快速排序(QuickSort)算法介绍

    算法简介 快速排序(Quicksort)是对冒泡排序的一种改进算法.由C. A. R. Hoare在1960年提出.该算法使用广泛.效率很高,是最重要的排序算法之一. 该算法的实现基本可分为以下几步: ...

  5. 理解快速排序 | 打通算法学习的任督二脉

    本文作者胡光 前百度高级算法研发工程师,ACM 国际大学生程序设计大赛亚洲区金牌获得者 具体内容来自他在极客时间开设的免费公开课<常用算法 25 讲> 排序算法在工作中最常用,也是学习很多 ...

  6. C语言quick sort快速排序的算法(附完整源码)

    C语言quick sort快速排序的算法 C语言quick sort快速排序的算法完整源码(定义,实现) C语言quick sort快速排序的算法完整源码(定义,实现) #ifndef QUICK_S ...

  7. 快速排序(quickSort) 和 插入排序(insertSort)

    1.快速排序(quickSort) (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元素,都移到"基准" ...

  8. quicksort java_Java代码实现快速排序(QuickSort)

    Java代码实现快速排序(QuickSort) 核心思想 如果要排序数组中下标从p到r之间的一组数据,我们选择p到r之间的任意一个数据为pivot(分区点). 我们遍历p到r之间的数据,将小于pivo ...

  9. 数据算法之快速排序(quickSort)的Java实现

    本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. 快速排序的基本思想是通过一 ...

最新文章

  1. linux parted rpm,为Everest Linux构建QtParted的rpm包(四)
  2. Linux教程 网络管理命令Netstat的使用
  3. 七年前将UC卖给马云,套现300亿的何小鹏,现今再创新奇迹?播报文章
  4. 在对比了 GitHub 5000 个 Python 项目之后,我们精选出了这 36 个!
  5. 你遇到过最有诗意的句子是什么?
  6. Python学习笔记 03 Python对象
  7. 大漠软件c语言教程,大漠万能脚本编辑器无需写代码,截图可以制作脚本附视频教程...
  8. nexus6 android 6.0 root,KingRoot国内首个攻破Nexus6 支持超万款手机一键Root
  9. NC生成单据PK主键
  10. homeassistant搭建_安卓环境home assistant搭建
  11. 赖美云的认证照_火箭少女最新路透照出炉:吴宣仪赖美云魅力十足,张紫宁傅菁凭颜值圈粉...
  12. kafka auto.offset.reset值失效 earliest/latest详解
  13. 知道打印机的IP地址,win10怎样连接打印机?
  14. 嵌入式linux 修改mac,MAC to MAC 环境下,嵌入式linux的修改
  15. 西北乱跑娃 --- python opencv图像祛噪
  16. HP(惠普)大中华区总裁孙振耀退休感言
  17. 学习笔记:网络层,IP包头,路由器配置
  18. 【能源管理】制造行业中汽车厂房综合能效管理平台应用分析
  19. C语言数据结构 单链表的建立、遍历、查找、插入和删除操作
  20. 第四章 web前端开发工程师--JavaScript京东商城项目开发 4-1 京东商城顶部图片效果

热门文章

  1. 初学 Python(十三)——匿名函数
  2. Entity Framework 学习笔记(1)
  3. Oracle查询重复数据并删除,只保留一条记录
  4. IOS添加KeyMob广告管理库中文教程
  5. MSMQ: C# MSMQ编程问题
  6. 在编写存储过程时使用 Set NoCount On
  7. Katalon Studio自动化测试框架使用【2】--- 项目设置(MacOS)
  8. Received status code 403 from server: ForbiddenDisable Gradle ‘offline mode‘ and sync project
  9. Error: Command failed: xcrun instruments -s
  10. Xamarin.Android编译CPU类型选择方式