c语言快排过程,快速排序(快排)C语言实现

快速排序

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:经过一趟排序将要排序的数据分割成独立的两部分,其中一部分的全部数据都比另一部分的全部数据都要小,而后再按此方法对这两部分数据分别进行快速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列。是对冒牌排序的一种改进web

快速排序的平均时间复杂度为O(nlogn),是一种不稳定的排序算法,排序效率最高算法

快排思路(从小到大):

首先有 N 个待排序的数据,a[N] ,选择第一个数据做为哨兵(key,一般都是第一个),经过一趟排序将区间内比哨兵(key)大的数所有放到哨兵(key)后面,将区间内比哨兵(key)小的数所有放到哨兵(key)前面,这样就能够将原区间划分为两个区间,即哨兵(key)前、后的两个区间,而后对这两个区间分别进行上面的步骤,即从新选定哨兵(key),再划分区间,直到区间的数据只有一个为止

一、定义两个变量 i 和 j ,i = 0,j=N-1

二、选定哨兵(key),key=a[i]

三、从后面开始往前进行搜索,即从 j 的位置开始,进行 --j; 找到一个小于key的值a[j] 或者是 i== j 中止,将 j 位置上的数据赋值给 i 位置上,即a[i] = a[j]

四、再从前面开始日后进行搜索,即从 i 的位置开始,进行 ++i;找到一个大于key的值a[i] 或者是 i==j 中止,将 i 位置上的数据赋值给 j 位置上,即a[j]=a[i]

五、重复三、4步骤,直到区间数据只有一个为止(一个数据已是排好序的)svg

原序列:code

下标

0

1

2

3

4

5

6

7

8

9

数据

5

3

8

6

0

9

1

7

4

2

建立变量 i 、 j 、 key,i = 0(指向第一个数据),j=9(指向最后一个数据),key=a[i],即a[0]当作哨兵,而后从后往前开始寻找比key小的数,移动到key的前面,不断递减j的值,找到一个比5小的数是9号位的数据2,此时i=0,j=9,而后执行a[i]=a[j]xml

0

1

2

3

4

5

6

7

8

9

2

3

8

6

0

9

1

7

4

2

接着进行第二次的寻找,从前日后寻找比key大的数,移动到key的后面,不断递增i的值,找打一个比5大的数是2号位的数据8,此时i=2;j=9;而后执行a[j]=a[i]blog

0

1

2

3

4

5

6

7

8

9

2

3

8

6

0

9

1

7

4

8

第三次寻找从后往前寻找比key小的数,移动到key的前面,不断递减j的值,找到一个比5小的数是8号位的数据4,此时i=2;j=8;执行a[i]=a[j]排序

0

1

2

3

4

5

6

7

8

9

2

3

4

6

0

9

1

7

4

8

第四次寻找从前日后寻找比key大的数,移动到key的后面,不断递增i的值,找到一个比5大的数是3号位置的数6,此时i=3;j=8;执行a[j]=a[i]递归

0

1

2

3

4

5

6

7

8

9

2

3

4

6

0

9

1

7

6

8

依次类推,不断进行上面的循环比较,最后将key放到中间的位置,这里是5号位,5号位前面的都比5小,后面的数都比5要打,通过一趟比较以后获得的结果为图片

0

1

2

3

4

5

6

7

8

9

2

3

4

1

0

5

9

7

6

8

注意:一趟的比较结果是不会得出最终的结果,获得的结果是把比key大的和比key小的分到key的两边而已,须要再次对下标5两边的区间当作两个新的序列,分别进行上述操做,此过程是一个递归的过程,直到区间的数据只有一个为止(不能进行比较了,由于一个数已是有序的),这样通过必定的趟数以后,才能获得最终的结果it

C语言实现

#include

#define N 10

/*快速排序*/

void Qsort(int *a,int low ,int high)

{

if(low>=high)

return ;

printf("start:%d end:%d\n",low,high) ;

int first = low ;

int last = high ;

int key = a[low] ;

while(first

{

while(first=key)

--last ;

a[first] = a[last] ;

while(first

++first ;

a[last] = a[first] ;

}

a[first] = key ;

Qsort(a,low,first-1) ;

Qsort(a,first+1,high) ;

}

int main(void)

{

int a[N] = {5,3,8,6,0,9,1,7,4,2} ;

int i;

printf("原来序列:") ;

for(i=0;i

printf("%d ",a[i]) ;

printf("\n\n") ;

/*快速排序*/

printf("每次排序的区间为:\n") ;

Qsort(a,0,N-1) ;

printf("\n排后序列:") ;

for(i=0;i

printf("%d ",a[i]) ;

printf("\n") ;

return 0 ;

}

7555622d68b63da7c8a22ae9ca7c870d.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值