快速排序

来源:互联网 发布:软件测试教学视频 编辑:程序博客网 时间:2024/06/11 09:16

快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列,快速排序的时间复杂度为O(n*log(n)),最坏的情况是O(n^2),快速排序是不稳定的

复杂度的证明

最优情况

在最优情况下,Partition每次都划分得很均匀,如果排序n个关键字,其递归树的深度就为 [log2n]+1( [x] 表示不大于 x 的最大整数),即仅需递归 log2n 次,需要时间为T(n)的话,第一次Partiation应该是需要对整个数组扫描一遍,做n次比较。然后,获得的枢轴将数组一分为二,那么各自还需要T(n/2)的时间(注意是最好情况,所以平分两半)。于是不断地划分下去,就有了下面的不等式推断:

图片

最坏情况

当待排序的序列为正序或逆序排列时,且每次划分只得到一个比上一次划分少一个记录的子序列,注意另一个为空。如果递归树画出来,它就是一棵斜树。此时需要执行n‐1次递归调用,且第i次划分需要经过n‐i次关键字的比较才能找到第i个记录,也就是枢轴的位置,因此比较次数为 ,最终其时间复杂度为O(n^2)。

图片

c++代码

#include<iostream>using namespace std;int quickSort(int *a, int start, int end) {    if(start >= end) return 0;    int temp = 0;    int key = a[start];    int low = start, high = end;    while(low < high) {        while(low < high && a[high] >= key) high--;        while(low < high && a[low] <= key) low++;        if(low != high) {            temp = a[low];            a[low] = a[high];            a[high] = temp;        }    }    a[start] = a[high];    a[high] = key;    quickSort(a, start,  high - 1);    quickSort(a, high + 1, end);    return 0;}int main() {    int a[10] = {1, 3, 2, 5, 8, 5, 4, 4, 0, 3};    quickSort(a, 0, 9);    for(int i = 0; i < 10; i++) printf("%d ", a[i]);}