内部排序(六)快速排序(下)子集划分与快排实现

这篇博客详细介绍了快速排序的子集划分过程,包括选择枢轴、设置指针、遍历子序列等步骤。通过举例说明了在子集划分中遇到等于枢轴元素的情况及其影响,探讨了两种不同的遍历策略。同时,文章提到了快速排序的递归实现可能面临的效率问题,提出在数据量小时切换到插入排序的优化方案,并提供了实现代码的链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集划分在上一篇日志中讲快速排序的实现思路时已经讲到,这里先再用一个简单的例子来回顾一下子集划分,假设我们的待排序列是这样:

假设我们已经做好了选枢轴的操作,并且把枢轴放到了Right-1的位置了,也就是图中的49。接着设置两个指针,指向待排序列的第一个位置和最后一个位置,然后就可以开始子集划分了。

  1. 第一步首先从Low指针开始往右遍历,如果遇到比枢轴大的元素,Low指针就停止。这时发现Low指向的27比49小,Low就往左移动,38也比49小,继续往前,直到Low遇到65,66比49大,那么Low指针就停下来,指向65的位置。

  1. 第二步到从High指针开始往左遍历,如果遇到比枢轴小的元素,High指针就停止遍历。97比49小,High指针减减,76也比49小,High指针继续减减。
  2. 直到High指针遇到13,就停下来。当Low和High指针都做完遍历操作后,就把两个指针的元素进行交换。

  1. 做完交换后,就可以进行下一轮的遍历,也就是重复1-3的步骤。Low指针继续往左遍历,指向了65,发现65比49大,Low指针停了下来;到High指针往右遍历,发现13比49小,High指针也停了下来。

  1. 此时Low指针和High指针错位了,所以这一轮快速排序就该结束了,由图我们可以看到,枢轴的正确位置明显在Low指针的位置,因为枢轴49放到Low指针指向的位置后,49左边的元素都比它大,右边的与元素都比它小,一轮快排的最后一步就是把枢轴放到Low指针的位置。

以上就是子集划分的过程,接下来对枢轴49左右两个子序列用递归的方式继续做子集划分即可。这样看来是不是很像归并排序?

快速排序之所以快的原因就是,每一轮快速排序中以枢轴为界做完子集划分之后,最后枢轴都会被换到正确的位置上,且之后不会再移动!!为什么?因为每一轮快速排序都是以上一个枢轴

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值