快速排序

快速排序算法

   1.算法的思想

 对输入的数组 a[i , j] 进行排序:

1) 分解:将输入的数组分解成三部分—— a[i , k - 1], a[k] 和 a[k + 1 , j],使得a[i , k - 1]中的元素不大于(或者小于)a[k],a[k + 1, j]中的元素大于(或者不小于)a[k];

2) 递归求解:对于每部分递归调用快速排序算法,进行排序;

  2. 算法的实现

template<class T>
int Partition(T a[], int left, int right)
{
    T x = a[left];
    while(left < right){
        while( a[right] >= x && left < right)  right--;
        if(left < right)  a[left++] = a[right];
        while( a[left] <= x && left < right)  left++;
        if(left < right) a[right--] = a[left]; 
    }
    a[right] = x;
    return right;
}


template<class T>
void QuickSort(T a[], int left, int right)
{
    if(left < right){
        int temp = Partition(a, left, right);
        QuickSort(a, left, temp - 1);
        QuickSort(a, temp + 1, right);
    }
}

  3. 算法分析

   快速排序算法的最好时间复杂度为Ο(nlog(n)),此时为每次所取的基准恰好为中值,其平均时间复杂度为Ο(nlog(n))。但当基准处于数据的极端时,如本次排序的最大值或者最小值,会增大时间复杂度。最坏的情况下,输入的数据恰好是有序的,此时的时间复杂度为Ο(n2)。

  4. 算法的改进

   对于快速排序算法中出现的最坏时间复杂度,可以通过改变基准来减少该情况的发生。原始的快排每次选择的基准为该次排序的第一个数据,可以对此进行修改,在选择基准之前生成一个随机数r(left <= r <= right),然后将随机数位置对应的数据与该次排序的第一个数据进行交换,可以有效地减少排序时出现极端的情况。

posted on 2016-10-07 11:53  JackTheRipper  阅读(264)  评论(0)    收藏  举报

导航