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

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

假设我们已经做好了选枢轴的操作,并且把枢轴放到了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左右两个子序列用递归的方式继续做子集划分即可。这样看来是不是很像归并排序?

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值