【C++單排之路】基本排序算法 -- 快速排序

在所有的比較排序中,快速排序的實際效率是最高的,即便最壞情況的時間複雜度爲O(n^2),也是分治算法的一種

大體的算法思想不再贅述,開卷有益,書上說的很清晰。


其中核心爲Partiton函數,

基本算法是對於一個數組a找到一個位置p,使得p之前的元素都不大於a[p],p之後的元素都不小於a[p]



//快速排序:
//快速排序的一種最壞情況的算法複雜度爲O(n^2),但是在實際中,卻是效率最好的排序算法,因爲它的平均算法複雜度
//快速排序也是一種分治算法
// Author's E-mail : [email protected]  Feel free to contact me for comments on my work
#include <iostream>
#include <cstdlib>
#include <ctime>
#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
void exchange(int &a,int &b){
    int temp = a;
    a = b;
    b = temp;
}
int Partition(int *a,int p,int r){
    int x = a[r];
    int s = p - 1;//s作爲小於x的區域末尾,與大於x的區域分隔開
    for (int i = p; i < r;i++){
        if(a[i]<x){
            s++;
            exchange(a[s], a[i]);
        }
    }
    exchange(a[s + 1], a[r]);
    return s + 1;
}
//由於劃分數組時情況不同會對算法效率由較大影響,在主元的選取上,採用隨機抽樣而不是隻去a[r]作爲主元,這樣期望對數組的劃分是均衡的
int RandomPartition(int *a,int p,int r){
    int t = random(p,r);
    exchange(a[t], a[r]);
    return Partition(a, p, r);
}
void QuickSort(int *a,int p,int r){
    if(p<r){
        //int q = Partition(a, p, r);
        int q = RandomPartition(a, p, r);
        QuickSort(a,p,q-1);
        QuickSort(a, q + 1, r);
    }
}
void printArray(int *a){
    for (int i = 0; i <= 9;i++){
        cout << a[i] << "  ";
    }
    cout << endl;
}
int main(){
    srand((unsigned)time(NULL));
    int array[] = {4,1,3,2,16,9,10,14,8,7};
    QuickSort(array,0,9);
    printArray(array);
    system("pause");
    return 0;
}

實際上,出現最差情況的時候,是由於劃分時,剩下的n-1個元素全部被劃到一邊去了,爲了儘可能的避免這種情況,對於partition函數中主元的選取,使用隨機抽樣的方式來代替默認的a[r]。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章