C++递归快速排序算法

快排流程

这篇博客将介绍C++实现的递归快速排序算法。

如图所示,递归快排的思想是如下。从待排序数列中,选取一个值,作为进一步排序的中间点。这个值是序列中的任意一个元素。

接下来,看中间点左边的所有数,是否都是小于这个中间点元素的,如果是就跳过,如果不是就挪到中间点右边去。

然后看中间点右边所有数,是否都是大于这个中间点元素的,如果是就跳过,如果不是就挪到中间点左边去。

此时本次递归任务完成。

分别对中间点左边的数列和中间点右边的数列进行同样方法的排序。

以上便是快排的简单思想。实现起来有一下几点需要注意:

在将中间值选定为最左值编程时,思想有所不同。每次递归都要选定最左值作为将来的中间值,然后有两个指针,一个从左向右扫描,一个从右向左扫描。直到两个指针相遇为止。在这种思想下,要首先保证每次计算之前,数列的最右边的那个值是最大值。否则一旦最大值在最左边,并且选定为中间值,左指针向右扫描的时候将会出现无法停止的情况。右指针则不会出现这种情况,因为右指针扫描条件是元素大于中间值,停不下来的情况下必定是所有值都大于最左值,那么遇到中间值本身一定会停下来。这一点结合后面的代码将会更清晰。

另外就是每次递归时,参与排序的元素是不包括那个右边最大值的,最大值是左指针扫描的终点,避免重复。

这种快排的平均时间复杂度是nlog(n)。计算方法涉及数学归纳法在此不详述。可以参考《数据结构、算法与应

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值