快速排序

33 篇文章 0 订阅
28 篇文章 0 订阅

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

一、基本思想

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

    

二、快速排序的实现

复制代码
代码
    
#include<iostream>
using namespace std;
int  QuickSort(int Data[], int low, int high)
 {
        if (low>high)
           return 0;
        int pivot = Data[low];
        while (low<high)
        {
            while ((low<high) && pivot <= Data[high])
                --high;
              Data[low]=Data[high];
             while ((low<high) && (pivot >= Data[low]))
                ++low;
               Data[high]=Data[low];           
        }   
        Data[low]=pivot;
        return low;    
    }
    
   void QSort(int Data[],int low ,int high) 
   {
    int mid;
    if(low<high)
    {
      mid=QuickSort(Data,low,high);
      QSort(Data,low,mid-1);
      QSort(Data,mid+1,high);
    }
   } 
int main()
{
  int Data[10]={14,25,68,9,57,65,49,85,325,41};
  QSort(Data,0,9);
  for(int i=0;i<10;i++)
  cout<<Data[i]<<" "; 
  return 0;
} 


复制代码

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值