快速排序,顾名思义,很快。最坏情况下数据复杂度为O(n^2),平均时间复杂度为O(NlogN).
假设我们现在要队序列{6,1,3,4,2,5,8,7,9,0}用快排来排序
首先我们需要一个基准数,我们就把6设为基准数;
接下来,我们定义i,j两个变量,让j从0开始向左走,让i从6开始向右走(注意一定是j先走),当i指向的数大于基准数,j指向的数小于基准数时,就交换i,j指向的数。或者当i,j相遇时,就把相遇时的数和基准数交换
比如第一次交换之后,序列就变成了{6,1,3,4,2,5,0,7,9,8}
这时左边的序列为{6,1,3,4,2,5,0},右边序列为{7,9,8};
对于左边的序列,我们就让基准数为3,然后重复上面 *** 作
对于右边,我们就让基准数为7,然后重复上面 *** 作。
直到所有的数全部归位。
为什么一定是j先走?快排为什么快?假如有以下序列{6,1,2,3,4,7,9}
如果让i先走,j后走,那么第一次交换之后的序列为{7,1,2,3,4,6,9}
这与我们想达到的序列{1,2,3,4,6,7,9}的初衷是不是背离了
因为快排是跳跃式交换,快排每次排序都会设立基准点,将大于基准点的数放在右边,将小于基准点的数放在左边。交换的距离变大了,交换的次数自然就变少了,速度就变快了。
题目 题目描述利用快速排序算法将读入的 NN 个数从小到大排序后输出。
快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)
输入格式第 11 行为一个正整数 NN,第 22 行包含 NN 个空格隔开的正整数 a_iai,为你需要进行排序的数,数据保证了 A_iAi 不超过 10^9109。
输出格式将给定的 NN 个数从小到大输出,数之间空格隔开,行末换行且无空格。
输入输出样例输入 #1复制
5 4 2 4 5 1
输出 #1复制
1 2 4 4 5代码展示
#includeint n,a[100000]; void sort(int l,int len) { int i,j,mid,t; i=l,j=len; mid=a[(i+j)/2];//基准数 while(i<=j) { while(a[i] mid) j--;//右边大于基准数 if(i<=j)//不满足时,就交换 { t=a[i]; a[i]=a[j]; a[j]=t; i++; j--; } } if(l 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)