【每日一题(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;
}

速度

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

数据量 快速排序所需时间 希尔排序所需时间 插入排序所需时间 选择排序所需时间
5000 0.001s 0.001s 0.031s 0.047s
20000 0.002s 0.006s 0.550s 0.733s
50000 0.007s 0.016s 3.569s 4.624s
100000 0.015s 0.037s 13.799s 17.952s
1000000 0.203s 0.516s
10000000 6.143s 8.360s
100000000 501.819s 132.949s

猜你喜欢

转载自blog.csdn.net/qq_40861916/article/details/79491290