直白快速排序算法,C语言实现

来源:互联网 发布:好用的安卓浏览器知乎 编辑:程序博客网 时间:2024/05/16 06:41

转载自:http://www.brieftime.net/articles/719
前面说了一篇堆排序,觉得不过瘾,再来一篇快速排序

同样,理论这里暂不涉及,我们直接通过实例入手:如下为一个含有10个元素的数组:

0

1

2

3

4

5

6

7

8

9

72

6

57

88

60

42

83

73

48

85

取区间第一个数为基准数,初始时,i = 0;  j = 9;   X = a[i] = 72

由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑[我们用红色表示一个坑,蓝色表示i的位置,紫色表示j的位置],可以将其它数据填充到这来。
从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++; 这样一个坑a[0]就被搞定了。如下图:

0

1

2

3

4

5

6

7

8

9

48

6

57

88

60

42

83

73

48

85

但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X=72的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j–;

0

1

2

3

4

5

6

7

8

9

48

6

57

88

60

42

83

73

88

85

i = 3; j = 7; X=72

再重复上面的步骤,先从后向前找,再从前向后找。
从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;数组变为:

0

1

2

3

4

5

6

7

8

9

48

6

57

42

60

42

83

73

88

85

从i开始向后找,当i=5时,由于i==j退出。
此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。

0

1

2

3

4

5

6

7

8

9

48

6

57

42

60

72

83

73

88

85

到这里可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。

基本步骤:

1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。

下面给出源程序供参考:

点击(此处)折叠或打开

  1. include <stdio.h>
  2. //quick sort
  3. void quick_sort(int s[],int l, int r)
  4. {
  5.  
  6.     if (l< r)
  7.     {
  8.         int i = l, j = r, x= s[l];//初始化
  9.         while (i < j)
  10.         {
  11.             while(i< j && s[j]>= x)// 从右向左找第一个小于x的数,如果不小于j就前移
  12.                 j--;
  13.             if(i< j)
  14.                 s[i++]= s[j];//填坑并将i后移一个位置
  15.  
  16.             while(i< j && s[i]< x) // 从左向右找第一个大于等于x的数,如果小于i就后移
  17.                 i++;
  18.             if(i< j)
  19.                 s[j--]= s[i];//填坑并将j前移一个位置
  20.         }//退出while
  21.         s[i]= x;
  22.         quick_sort(s, l, i- 1);// 递归调用
  23.         quick_sort(s, i+ 1, r);
  24.     }
  25. }
  26.  
  27. void main()
  28. {
  29.     int s[]={48,6,57,42,60,72,83,73,88,85};
  30.     quick_sort(s,0,9);
  31.     for (int i=0;i<10;i++)
  32.     {
  33.         printf("%d ",s[i]);
  34.     }
  35. }


阅读(6) | 评论(0) | 转发(0) |
0

上一篇:浅谈c语言内存分区

下一篇:快速排序优化

相关热门文章
  • 远离C++
  • Java自学成长路线
  • 查找如果相等,就赋值...
  • 微课制作要求五大点
  • 一名IT从业者的英语口语能力成...
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • 我的ChinaUnix博客被锁定了,...
  • 怎样破解雅虎邮箱密码...
  • 虚拟机中ubuntu无线连接问题...
  • IBM DS3400 盘阵怎么查看是单...
  • 启动auditd时,报错如下,怎么...
评论热议
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅族2手机锁定了怎么办 flyme的密码忘了怎么办 魅族note3忘记开机密码怎么办 小米3s手机死机怎么办 二手小米手机有账号锁怎么办 小米五指纹解锁失灵怎么办 小米note3指纹解锁失灵怎么办 小米4s手机屏幕失灵怎么办 vivo手机没有otg功能怎么办 头戴耳机压头发怎么办 小米4c很卡怎么办 小米4c玩王者怎么办 小米4s屏幕乱跳怎么办 小米4s手机后壳碎了怎么办 小米5spius开不了机怎么办 小米5s无限重启怎么办 小米5s外屏坏了怎么办 小米5s内屏碎了怎么办 小米4充电没反应怎么办 小米5手机变卡了怎么办 小米5变卡了怎么办 小米手机充电无反应怎么办 小米6相机卡顿怎么办 华为手机玩游戏发热怎么办 华为手机变慢了怎么办 华为p10手机变慢怎么办 华为手机账户密码忘记了怎么办 QQ浏览器无法加载插件怎么办 电脑开了机黑屏怎么办 扫描仪打不开运单扫描怎么办 打印机不支持64位系统怎么办 xp系统dnf闪退怎么办 w10电脑所有程序都打不开怎么办 安卓手机太卡怎么办 系统装到f盘了怎么办 虚拟机占c盘内存怎么办 外机连无线虚拟机显示受限怎么办 使用msdn下载解压后怎么办 路由80端口被占用怎么办 c盘拒绝粘贴文件怎么办 oracle数据库密码忘了怎么办