当对一串数量较大的无序数组排序时常规的冒泡排序与选择排序等方法效率就很低,因此便有了利用递归比较排序的较为高效的方法——快速排序法
在一串无序数组中寻找任意一个“哨兵数”(通常为了方便,取数组中间值)然后从数组左右端点开
始依次与哨兵数比较,比哨兵数小的放在左边比哨兵数大的放在右边(即从端点处行进,左端扫描
到比哨兵数大的停止扫描,右端扫描到比哨兵数小的也停止扫描,然 后交换两数使其保持 左小右
大),直到进行到哨兵数本身,再将数组以哨兵数为界一分为二,再将左右数组的左右端点为开始
点,选取左右数组的任意值为下一阶段哨兵数,继续进行比较在分界,再比较,,,如此循
环,直到不可再分为止。(类似于二分法)
如下:
#include <iostream>
using namespace std;
void kuaipai (int a[],int l,int r){
int i=l,j=r;//记录数组左右端点
int shaobing=a[(l+r)/2],temp;//选取哨兵数(以中间值为例)
do{
while (a[i]<shaobing)i++; //哨兵数<=a[i] 时停止
while (a[j]>shaobing) j--; //哨兵数>=a[j]时停止
if(i<=j){ //此时已经扫描到符合条件的两个数开始进行交换
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
j--;
}
}while (i<=j);
if(l<j) kuaipai(a,l,j);
if(r>i) kuaipai(a,i,r);
/*此时由于按照题目应当调用两个对一分为二的数组进行左右两边各
一次的递归调用*/
} //以上快排函数的程序可以当作模板
int main()
{
int N;
cin>>N;
int a[N];
for (int i=0;i<N;i++)
cin>>a[i];
int l=0,r=N-1; //从0开始
kuaipai (a,l,r);
for(int p=0;p<N;p++){
cout<<a[p]<<" ";
}
cout<<endl;
return 0;
}