快速排序
采用“分治”的思想,对于一组数据,选择一个基准元素(base),通常选择第一个或最后一个元素。
通过第一轮扫描,比base小的元素都在base左边,比base大的元素都在base右边。
再有同样的方法递归排序这两部分,直到序列中所有数据均有序为止。
实例
对数组[3,7,1,6,4,9,2]进行快速排序。
一律将基准元素取为第一个元素。
设置左右指针辅助排序。
初始,base=3,左指针指向3,右指针指向2。
先让右指针从后往前走,如果指向的元素小于base,则用r的元素替代l位置的元素。右指针保持不动,左指针从左往右移动,当左指针指向数值大于base时,把l指向的元素替换给r。接着右指针再往前移动,重复以上操作直至两指针相遇。
如图,右指针指向2,小于base,把r指向的值替换给l。得到下图数组。
如图,完成了数值的替换。
接着,左指针从左到右移动,到7位置发现7>base,把l指针的元素替换给r。
右指针从后往前移动,移到1时,发现1<base,把r指向的元素数值替换给l。
左指针从左往右移动,移到下一个1与右指针重合。将base替换到指针重合指向的位置。
最后得到第一列排序结果。
后续步骤即将3的左右子数组进行上述相同的排序处理。
代码实现
#include <iostream>
using namespace std;
const int N = 1000010;
int q[N];
void quicksort(int q[], int l, int r){
if(l < r){
int base = q[l];
int left = l;
int right = r;
while(left < right){
while(left < right && q[right]>= base){
right--;
}
q[left] = q[right];
while(left < right && q[left]<=base){
left++;
}
q[right] = q[left];
}
q[left] = base;
//cout<<left<<endl;
quicksort(q, l, left-1);
quicksort(q, left+1, r);
}
}
int main(){
int n;
cin>>n;
int i;
for(i =0; i<n; i++){
cin>>q[i];
}
quicksort(q, 0, n-1);
for(i =0; i<n; i++){
cout<<q[i]<<" ";
}
return 0;
}
或者使用stl
sort(q, q+n);