排序 - 快速排序(C++)

本文介绍了快速排序算法,一种基于分治法的排序算法。文章重点讲述了快排的主要思想,即选择轴值pivot进行子集划分,并确保pivot被放置到正确位置。还提供了完整的C++代码示例和运行结果。
摘要由CSDN通过智能技术生成

前言的前言:

如果看不懂这些干巴巴的理论文字,那就先不用看了,下面代码中有详细的注释,大家可以先跟着代码走几遍,回过头来再看这些文字描述,总之:纸上得来终觉浅,绝知此事要躬行。

前言:

排序算法哪家强,从实际应用的角度上将,快排表现很好。很自然地,人们会觉得短数组比长数组更好处理,因此可能会想到将原始数组分为若干各子部分然后分别进行排序。快速排序就是基于分治法的排序算法,这不过它更多地侧重于“分”,没有明显的“合”过程。

快速排序的要点:

1.快排算法的主要思想:

(1)从待排序序列S中“任意”选择一个记录k作为轴值(Pivot)。
(2)将剩余的记录分割(partition)成左子序列L和右子序列R。
(3)L中所有记录都小于或等于k,R中记录都大于等于k,因此k正好位于正确的位置。
(4)对子序列L和R递归进行快速排序,直到子序列中只含有0或1个元素,退出递归。

2.如何选择轴值pivot,这对快排的时间性能影响很大,轴值的选择应尽量使得序列可以据此划分为均匀的两半。

3.如何实现最关键的分割的过程:最简单的分割方法就是左指针l和右指针r(下标)分别从序列的左端、右端向序列中间扫描;左边越过那些小于等于pivot的值,停在第一个大于pivot的值Kl;右边越过那些大于等于pivot的值,停在第一个小于pivot的值Kr;交换逆置记录Kl和Kr;从交换后的位置,继续从左右向中间扫描,发现并交换逆置记录对,直到l、r交叉而整个序列扫描完毕。这种方法适用于需要处理l、r边界,轴值最后定位等情况。
4. 由于递归开销过大,所以当子序列足够短时,我们采用插入排序来完成对子序列的排序。

5. 快速排序之所以快是因为:它每次选定轴值pivot并进行划分子集(分割交换)后该轴值被一次性的放到了他最终该放到的位置。


下面以一趟分割交换为例:

下标

0

1

2

3

4

5

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值