概述
快速排序
快速排序由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:%dn",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("nn") ;
/*快速排序*/
printf("每次排序的区间为:n") ;
Qsort(a,0,N-1) ;
printf("n排后序列:") ;
for(i=0;i
printf("%d ",a[i]) ;
printf("n") ;
return 0 ;
}
最后
以上就是虚拟宝马为你收集整理的c语言快排过程,快速排序(快排)C语言实现的全部内容,希望文章能够帮你解决c语言快排过程,快速排序(快排)C语言实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复