伪代码算法之快速排序(分治排序)

开始的地方应该有个标题

我目前认为:名字不应该仅仅是一个符号,如果可以的话,应该能达到某种程度的“顾名思义”。
所以,我认为,应该叫做分治排序
所以,你应该先知道什么是“分治”。顾名思义,分治就是“分而治之”。为了减少知识的耦合,这里并不详细介绍“分治”。


假如有这样一列数:7,4,8,6,5,9,1,2,3,10。

第一步

我们先随便挑一个数,比如“8”。
把比8小的放在8的左边,把比8大的放在8的右边。
先不要考虑用代码实现这个过程,因为步步为营将会寸步难行,你应该先熟悉整个流程,细节的地方下面会有介绍。所以,不要多想,继续往下看。
这样,以8为界,我们得到了两列数。
结果有可能是这样的(当然,这是我随便分的,只要结果是比8小的在左,比8大的在右就好):
7,4,6,5,1,2,3,8,9,10
我们给第一步这个流程起个名字,叫“造分水岭”。

第二步

我们分别对第一步里得到的两列数(8的左边和右边)进行造分水岭的流程。
也就是说:
对于7,4,6,5,1,2,3
我们再次随机找一个喜欢的数,然后把比它小的放在它的左边,比它大的放在它的右边。比如,这次我们选中了6。
那么结果可能是这样的:4,5,1,2,3,6,7。
然后对于9,10这列数,我们也进行同样的操作。

最后

其实到这里,你可能已经知道分治排序的核心思想了,很简单的东西。简单来说,就是先对整个数列造分水岭,然后对分水岭两边的子数列造分水岭,然后对得到的新数列继续造分水岭,直到得到的子数列中只有一个数。
这样,排序这个任务也就完成了。其中的美妙之处,就只能自己体会了。

如果有人认为分治排序对新手来说是个“难题”

如果有人认为分治排序对新手来说是个难题,那么可能难点就是“如何把比8小的放在8的左边,把比8大的放在8的右边”。
还用之前的那列数做示例:7,4,8,6,5,9,1,2,3,10

  • 先从数列的右边往左找,直到找到一个比8小的数(本例中是3);
  • 8与3换位置;(结果A:7,4,3,6,5,9,1,2,8,10)
  • 再从数列的左边往右找,直到找到一个比8大的数(本例中是9);
  • 9与8换位置;(结果B:7,4,3,6,5,8,1,2,9,10)
  • 再从数列的右边往左找,直到找到一个比8小的数(由于结果A中,已经确定最右边的10是比8大的,所以,这次从10左边开始找,这次找到的是2)
  • 8与2换位置;(结果C:7,4,3,6,5,2,1,8,9,10)
  • 再从数列的左边往右找,直到找到一个比8大的数(由于结果B中,已经确定最左边的7,4,3,6,5是比8小的,所以,这次从5的右边找,这次没有找到,说明左边的数已经全是比8小的了)
  • 这时发现8的右边也全是比8大的了。

想象一下,这是一个怎样的过程?
像有两辆推土机,面对面开过来,推土机中间是这列数。
右边的推土机往左开,直到遇到比8小的。
停下来,换位置。
左边的推土机往右开,直到遇到比8大的。
停下来,换位置。
右边的推土机从上次停下来的位置继续往左开,直到……。……。
左边的推土机从上次停下来的位置继续往右开,直到……。……。

这就是分治排序

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值