快速排序

     快速排序是C.R.A.Hoare于1962年提出的一种分区交换排序。它采用了一种分治法(Divide-and-ConquerMethod)策略,分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。快速排序是目前己知的平均速度最快的一种排序方法。

一、基本思想

  快速排序方法的基本思想是:从待排序的n个记录中任意选取一个记录Ri(通常选取序列中的第一个记录)作标准,调整序列中各个记录的位置,使排在Ri前面的记录的关键字都小于Ri的关键字,排在Ri后面的记录的关键字都大于Ri的关键字,我们把这样一个过程称作一次快速排序。在第一次快速排序中,确定了所选取的记录Ri最终在序列中的排列位置,同时也把剩余的记录分成了两个子序列。对两个子序列分别进行快速排序,又确定了两个记录在序列中应处的位置,并将剩余的记录分成了四个子序列,如此重复下去,当各个子序列的长度为1时,全部记录排序完毕。   

    

二、快速排序的实现

复制代码
代码
     public   void  QuickSort(SeqList < int >  sqList,  int  low,  int  high)
    {

        
if  (low  >  high)  return ;
        
int  pivot  =  sqList.Data[low];
        
int  i  =  low  +   1 ;
        
int  j  =  high;
        
int  temp;
        
while  (i  <  j)
        {
            
while  ((i  <  j)  &&  (pivot  >=  sqList.Data[i]))
            {
                
++ i;
            }
            
while  ((j  >=  i)  &&  pivot  <=  sqList.Data[j])
            {
                
-- j;
            }
            
if  (i  <  j)
            {
                temp 
=  sqList.Data[i];
                sqList.Data[i] 
=  sqList.Data[j];
                sqList.Data[j] 
=  temp;
            }
        }
        
if  (low  <  j)
        {
            temp 
=  sqList.Data[low];
            sqList.Data[low] 
=  sqList.Data[j];
            sqList.Data[j] 
=  temp;
        }
        QuickSort(sqList, low, j 
-   1 );
        QuickSort(sqList, j 
+   1 , high);
    }
复制代码

三、时间复杂度分析
  快速排序的算法的执行时间取决于标准记录的选择。如果每次排序时所选取记录的关键字的值都是当前子序列的“中间数”,那么该记录的排序终止位置在该子序列的中间,这样就把原来的子序列分解成了两个长度基本相等的更小的子序列,在这种情况下,排序的速度最快。最好情况下快速排序的时间复杂度为O(nlog2n)
  另一种极端的情况是每次选取的记录的关键字都是当前子序列的“最小数”,那第该记录的位置不变,它把原来的序列分解成一个空序列和一个长度为原来序列长度减1的子序列,这种情况下时间复杂度为O(n2)。因此若原始记录序列巳“正序”排列,且每次选取的记录都是序列中的第一个记录,即序列中关键字最小的记录,此时,快速排序就变成了“慢速排序”。
  由此可见,快速排序时记录的选取是非常重要的。在一般情况下,序列中各记录的关键字的分布是随机的,所以每次选取当前序列中的第一个记录不会影响算法的执行时间,因此算法的平均比较次数为O(nlog2n)。
  快速排序是一种不稳定的排序方法。


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页