快速排序Quicksort

来源:互联网 发布:淘宝直播大v通道 编辑:程序博客网 时间:2024/05/01 16:07

快速排序
原理: 快速排序使用分治策略把一个序列根据轴点(pivot)分成两个子序列。步骤为:
1 从序列中挑出一个元素,作为轴点pivot。
2 把所有比轴点小的放在左序列,比轴点大的放在右序列(partition操作)。
3 对每个分区递归地进行步骤1-3,递归的结束条件是序列大小小于2。
整个问题的关键在于如何根据轴点进行partition操作。
复杂度分析
最坏情况时间复杂度O(n2)
每次选取的基准都是最大(小)的元素,导致每次只划分了一个子序列,需要进行n-1次划分才能结束递归,时间复杂度为O(n2)
最好情况时间复杂度O(nlogn)
每次选取的基准都能使划分均匀,只需要logn次划分就能结束递归
平均时间复杂度O(nlogn)
空间复杂度: O(logn)O(n)
主要是递归造成的栈空间的使用(用来保存left和right等局部变量),取决于递归树的深度。
稳定性:不稳定

code:

int partition(vector<int> &vec, int lo, int hi){    swap(vec[lo], vec[lo+rand()%(hi-lo+1)]);//随机交换    int pivot = vec[lo];    while(lo<hi)    {        while(lo<hi && pivot <= vec[hi])  //向左拓展右侧序列            hi--;        vec[lo] = vec[hi]; //小于轴点的归入左侧序列        while(lo<hi && pivot>vec[lo])              lo++;        vec[hi] = vec[lo];    }    vec[lo] = pivot;     return lo;}void Quicksort(vector<int> &vec,int lo, int hi) //区间左闭右开{    if(hi - lo<2) return;    int mi = partition(vec,lo,hi-1);  //partition参数为闭区间    Quicksort(vec,lo,mi);    Quicksort(vec,mi+1,hi);}

这里写图片描述
这里写图片描述

0 0