快速排序

       快速排序法事应用最广泛的排序算法之一,最佳情况下时间复杂度是 O(nlogn)。但是最坏情况下可能达到O(n^2)。说明快速排序达到最坏情况的原因。并提出改善方案并实现之。

答:

最坏情况就是,每次分都分出有一部分只有一个元素的。这样T(n) = n + T(n-1) = O(n*n);

最好的情况下,就是每次都各分一半。这样T(n) = 2*T(n/2)+n = 2*log2(n) + n*log2(n) = O(nlog2(n))

 

改进方案:改进选取枢轴的方法

1.随机选。2.选端值或者中心值。3.选取到中位数(不过觉得选到来。。。还不如排序了吧)

最终,选择用第一种,拼人品。

 

排序思想:分而治之,选取到一个值,以他为准,分两半,对这两半递归再分,直至只有一个元素。

 

#include <iostream>
#include <stdio.h>
#include <time.h>

using namespace std;

int myrand(int low , int high){
    return (rand()%(high - low))+low;
}

template<typename T>
void quicksort(T * array,int low,int high){
    if( low < high){

    int x = array[myrand(low,high)];
    int i = low,j = high;

    while( i < j){
        // 从左往右找到大于x的数
        while(i < j && array[i] < x)   
            i++;    
        // 从右往左找到小于x的数
        while(i < j && array[j] > x)  
            j--;    
        //如果i<j就交换值
        if(i < j)   
            swap(array[i],array[j]);
    }

    quicksort(array,low,i - 1);
    quicksort(array,i+1,high);
    }
}


int main(){
    srand(unsigned int(time(NULL)));

    int array[10];
    for(int i = 0;i<10;i++)
        array[i] = myrand(0,100);
    for(auto& elem : array)
        cout << elem << " ";
    cout << endl;

    quicksort(array,0,9);
    for(auto& elem : array)
        cout << elem << " ";
    cout << endl;


    system("pause");

    return 0;
}

 

posted @ 2015-08-22 17:27  forxtz  阅读(298)  评论(0)    收藏  举报