[pieces] Quicksort快速排序 模板

模板

这个模板采用了随机化的思路,相当于是不保存轴点的位置信息。这或许说明Partition算法不能使用随机化的思路减小qsort的不稳定性。

#include<iostream>
using namespace std;
int n,a[101];//正式提交的时候,要注意数组大小和数据类型
void qsort(int l,int r)//应用二分思想:其实不是严格的二分思想,这里只是借中点作为轴点的候选点
{
    int mid=a[(l+r)/2];//中间数,相当于是随机化,减小了完全倒序带来的复杂度增加的恶劣情况
    int i=l,j=r;
    do{//这里也可以直接使用while(i < j),而且i <= j 也是多余的。毕竟i=j直接就相当于退出了,为什么还要进循环浪费时间呢?
        while(a[i]<mid) i++;//查找左半部分比中间数大的数
        while(a[j]>mid) j--;//查找右半部分比中间数小的数
        if(i<=j)//如果有一组不满足排序条件(左小右大)的数
            swap(a[i++],a[j++]);//交换
    } while(i < j);
    //本次结束后,i左侧的都小于等于中间数,j右侧的都大于等于中间数。所以相当于也构造出了一个轴点(i或j)
    if(l<j) qsort(l,j);//递归搜索左半部分
    if(i<r) qsort(i,r);//递归搜索右半部分
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    qsort(1,n);
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
}

猜你喜欢

转载自blog.csdn.net/weixin_45502929/article/details/106331023