快速排序事基于分治的排序算法,其复杂度非常优秀,达到了O(NlogN)
级别,基本思想如下
对于一个无序数列a[N]
,我们任选其中的一个数字a[t]=x
作为基准数,我们将小于他的置于其左边,将大于他的置于其右边,这样我们就对数列在区间1~N完成了一次操作,通过此次操作,我们将数x
归位了
归位便是对数x
而言,他找到了其在有序数列中的位置,接下来,我们将操作递归至由x
分成的左右区间上,归位两个子区间的数,直到区间长度为1
简而言之三步走:
- 选定序列基准(任意皆可)
- 将小于基准的置于左边,大于基准的置于右边
- 对由基准隔开的左右两个子序列重复上述操作
void q_sort(int a[],int l,int r){//l,r分别是左右界
if(l>=r) //先写出口,写==也可以
return ;
int x=a[(l+r+1)/2],i=l-1,j=r+1;
while(i<j){
do i++; while(a[i]<x);//在左侧找到一个大于基准数的
do j--; while(a[j]>x);//在右侧找到一个小于基准数的
if(i<j)//如果ij撞了就说明结束
swap(a[i],a[j]); //交换找到的两个数
}
//向子序列递归
//这里的边界问题稍复杂,可以暂且背过结论
q_sort(a,l,j);
q_sort(a,j+1,r);
}