【每日一题(26)】高等排序算法(1) 快速排序(QuickSort)

快速排序

介绍

快速排序是工业上最常用的高等排序算法,最好情况下复杂度为O(nlogn)。
但是,在最糟糕的情况下,快排的复杂度可以降为O(n2),和冒泡排序没啥区别。但是这种情况及其少见。
因此,快排的平均复杂度为O(nlogn)。
另外,很多公司的面试题对快排情有独钟。所以,快排在ACM有着举足轻重的作用。
PS:快排是一种不稳定排序算法。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>
using namespace std;
int n;
void _printf(int *a,int n){
    for(int i = 0;i < n; i++){
        cout << a[i] << " ";
    }
    cout << endl;
}
void _sort(int *a,int left,int right){
    if(right > left){
        int v = a[left];
        int _left = left,_right = right;
        while(left != right){
            while(right > left && v < a[right]){
                //cout << "right " << right << endl;
                right--;
            }
            a[left] = a[right];
            while(right > left && a[left] <= v){
                //cout << "left " << left << endl;
                left++;
            }
            a[right] = a[left];
        }
        a[left] = v;
        //_printf(a,n);
        _sort(a,_left,left - 1);
        _sort(a,right + 1,_right);
    }
}
int main(){
    //FILE *fp;
    clock_t begin,stop;
    //fp = fopen("100000000.txt","r");
    while(cin >> n){
        int *a = new int[n];
        for(int i = 0;i < n; i++){
            //fscanf(fp,"%d",&a[i]);
            cin >> a[i];
        }
        cout << "start" << endl;
        begin = clock();
        _sort(a,0,n - 1);
        stop = clock();
        //_printf(a,n);
        cout << "runtime " << (double)(stop - begin)/CLOCKS_PER_SEC << "s" << endl;
    }

    return 0;
}

速度

快排的速度对于一般情况而言,快排的速度特别快,而且不占用多余内存,使用内部排序。

数据量快速排序所需时间希尔排序所需时间插入排序所需时间选择排序所需时间
50000.001s0.001s0.031s0.047s
200000.002s0.006s0.550s0.733s
500000.007s0.016s3.569s4.624s
1000000.015s0.037s13.799s17.952s
10000000.203s0.516s
100000006.143s8.360s
100000000501.819s132.949s
点赞