[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]<<" ";
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章