排序算法之快速排序

1、基本思想:

       快速排序是对冒泡排序的一种改进。

       在待排序表L[1...n]中任取一个元素pivot(通常可选第一个记录L[1]作为枢轴(或交点)),通过一趟排序,将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-1]中所有元素小于pivot,L[k+1...n]中所有元素大于或等于pivot,则pivot放在了其最终位置L[k]上,这个过程称作一趟快速排序,而后分别递归地对两个子表重复上述过程,直至每部分只有一个元素或空为止,即所有元素放在了其最终位置上。

 

2、一趟快速排序的具体做法:

      (1)附设两个指针low和high,他们的初值分别为low和high,设枢纽记录的关键字为pivotkey。

      (2)首先从high所指位置向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换。

      (3)然后从low所指位置起向后搜索,找到第一个关键字大于pivotkey的记录与枢轴记录互相交换。

      (4)重复(2)、(3),直至low=high为止。

3、快速排序算法:

int Partition(SqList &L,int low,int high){
//交换顺序表L中子表L.r[low...high]的记录,使枢轴记录到位,并返回其所在位置,此时
//在它之前(后)的记录均不大(小)于它。
    L.r[0]=L.r[low];                               //用子表的第一个记录作枢轴记录
    pivotkey=L.r[low].key;                         //枢轴记录关键字
    while(low<high){                               //从表的两端交替的像中间扫描
        while(low<high && L.r[high].key>=pivotkey) 
            --high;                                //将比枢轴记录小的记录移到低端
        L.r[low]=L.r[high];
        while(low<high && L.r[low].key<=pivotkey) 
            ++low;                                 //将比枢轴记录大的记录移到高端
        L.r[high]=L.r[low];
    }
    L.r[low] = L.r[0];                             //枢轴记录到位
    return low;                                    //返回枢轴位置
}//Partition

void QuickSort(SqList &L,int low,int high){
    if(low<high){                                  //递归跳出的条件
        int pivotloc = Partition(L,low,high);      //将L.r[low...high]一分为二
        QuickSort(L,low,pivotloc-1);               //对低子表递归排序,pivotloc是枢轴位置
        QuickSort(L,pivotloc+11,high);             //对高子表递归排序
    }
}

4、实例:

5、 性能分析:

     (1)空间效率:由于快速排序是递归的,需要借助一个递归工作栈。若每一趟排序都将记录序列均匀地分割成长度相接近的两个子序列,则栈的最大深度为\left \lfloor \log_{2}n \right \rfloor+1,但是,若每趟排序后,枢轴位置均偏向子序列的一端,则为最坏情况,栈的最大深度为n,因而空间复杂度在最坏情况下为O(n),平均情况下为O(\log_{2}n)

    (2)时间复杂度:快速排序的运行时间与划分是否对称有关,平均情况下,时间复杂度为O(n\log_{2}n),最坏的情况下可达到O(n²)。

    (3)稳定性:快速排序是一个不稳定的排序算法。

    (4)快速排序是所有内部排序算法中平均性能最优的排序算法。

6、参考文献:

      [1]《数据结构(C语言版)》,严蔚敏、吴伟民编著,清华大学出版社,ISBN:978-7-302-14751-0

      [2]《2019年数据结构考研复习指导》,王道论坛.组编,中国工信出版集团、电子工业出版社,ISBN:978-7-121-33708-6

posted @ 2019-01-17 22:11  有志当行  阅读(636)  评论(0)    收藏  举报