《啊哈!算法》1.3快速排序i和j谁先动的问题
Posted 爱作的小兔子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《啊哈!算法》1.3快速排序i和j谁先动的问题相关的知识,希望对你有一定的参考价值。
http://blog.csdn.net/ahalei/article/details/19825419这里是算法原文,首先感谢原作者!
while(a[j] >= temp && i < j)
j--;
while(a[i] <= temp && i < j)
i++;
i j6 1 2 7 9
这段代码原作者注道:“顺序很重要,要先从右往左找”,这句话让我纠结了许久。由于算法将基准数temp设置成了a[left],假若如下图所示我们先从右往左走,小人会停到7(注意循环的条件,当a[i]<=temp && i<j时小人在2,但由于符合这个条件i还会++小人会跑到7),同理右边的小人j最多只能到7(因为i<j是循环条件之一),i和j相遇就该和基准数交换了,于是得到“7 1 2 6 9”,注意到原先的基准数6左边的数并不都小于6(7的存在)。至于为什么会出现这种情况,关键原因在于若先让左边的小人i出发,由于其循环条件,i停下来时所处的数字一定是大于此时的基准数的,而j与i相遇并与基准数交换时(由于基准数在左),一个大于基准数的数字就会出现在交换后的基准数左面,当然就不符合要求(要求i,j相遇后与基准数交换,基准数左面均<=temp,右面均>=temp)。
以上是关于《啊哈!算法》1.3快速排序i和j谁先动的问题的主要内容,如果未能解决你的问题,请参考以下文章