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

在所有的比较排序中,快速排序的实际效率是最高的,即便最坏情况的时间复杂度为O(n^2),也是分治算法的一种

大体的算法思想不再赘述,开卷有益,书上说的很清晰。


其中核心为Partiton函数,

基本算法是对于一个数组a找到一个位置p,使得p之前的元素都不大于a[p],p之后的元素都不小于a[p]



//快速排序:
//快速排序的一种最坏情况的算法复杂度为O(n^2),但是在实际中,却是效率最好的排序算法,因为它的平均算法复杂度
//快速排序也是一种分治算法
// Author's E-mail : steven_zhaosh@163.com  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]。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值