快速排序!快速排序!快速排序!

快速排序事基于分治的排序算法,其复杂度非常优秀,达到了O(NlogN)级别,基本思想如下

对于一个无序数列a[N],我们任选其中的一个数字a[t]=x作为基准数,我们将小于他的置于其左边,将大于他的置于其右边,这样我们就对数列在区间1~N完成了一次操作,通过此次操作,我们将数x归位

归位便是对数x而言,他找到了其在有序数列中的位置,接下来,我们将操作递归至由x分成的左右区间上,归位两个子区间的数,直到区间长度为1

简而言之三步走:

  1. 选定序列基准(任意皆可)
  2. 将小于基准的置于左边,大于基准的置于右边
  3. 对由基准隔开的左右两个子序列重复上述操作
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);
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注