【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]。


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