# 第 2 节 切分

# 切分

通过切分,我们要达到这样的效果:把「切分元素」放在排序以后最终应该在的位置。

如下图所示,基准值为

一次切分要实现的效果是:【小于等于基准值的所有元素】基准值【大于等于基准值的所有元素】

  • 先选出一个元素,通常是这个数组最开始的那个元素,作为「切分元素」;
  • 然后经过一次扫描,使得扫描以后,数组的元素分为两个部分:
    • 第 1 部分,都小于切分元素;
    • 第 2 部分,都大于等于切分元素;
  • 最后我们只要交换一下第 1 个元素和第 1 部分(小于切分元素的部分)的最后 1 个位置的元素,这个 切分元素就呆在了最终它应该呆的位置

说明:示意图为了表意清晰没有讨论 = 的情况。

切分的思路是这样的:从标定点后面一个一个地比较到底,遇到比标定元素大的,就放过,遇到比标定元素小的,就依次放在标定元素的后面。大放过,小交换。

再看一个例子:

切分过程展示:

最后交换 65,完成切分。

说明:本节无代码,参考代码会放在「快速排序」的优化一节中。

# 总结

# 快速排序的基本想法

快速排序每一次都排定一个元素(这个元素呆在了它最终应该呆的位置),然后递归地去排它左边的部分和右边的部分,依次进行下去,直到数组有序。

# 快速排序的算法思想

分而治之(分治思想),与「归并排序」不同,「快速排序」在「分」这件事情上不想「归并排序」无脑地一分为二,而是采用了 partition 的方法,因此就没有「合」的过程。

# 与归并排序比较

归并排序不管数组的内容是什么,归并排序总是一分为二地去做排序运算,然后再归并起来。


说明:《算法 4》这本书里面的代码风格是极其不推荐的。代码是写给人看的,应该尽量避免代码个人风格化,采用统一规范的写法,保证易读性,可扩展性。


作者:liweiwei1419 链接:https://suanfa8.com/quick-sort/partition 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Last Updated: 11/18/2024, 11:23:03 PM