1.在《数据结构》这本书中快排的基本思想是以第一个数为哨兵,然后先从数组尾部遍历,找到第一个比哨兵小的数,将哨兵和这个数交换,记为hi;再从数组第一个地方开始遍历,找到第一个比哨兵大的树,将哨兵和这个数交换,记为lo。如果lo>=hi,那么这次快排到此结束。
在这里,对相同的数字采取了原地等待的方式,这也就是能保证遍历找数字时候不会越界。这时候就会导致一个问题,如果nums[hi] == nums[lo] 而且nums[hi] == 哨兵,那么就会造成死循环,没有一个下标会移动。所以我们必须让其中一个移动,如果两个都移动,那么hi-lo==1时候,两个指针就会完美错过
最后无论返回hi或者lo都是可以的
2.在《算法》这本书中快排的基本思想是以第一个数为哨兵,然后先从数组尾部遍历,找到第一个比哨兵小的数,停止遍历,记为hi;再从数组第一个地方开始遍历,找到第一个比哨兵大的树,停止遍历,记为lo。如果lo>=hi,那么这次快排到此结束,返回hi,否则交换hi和lo这两个位置的数字。最后hi这个位置存放的仍然是比哨兵小的数,所以应该将哨兵和hi位置数字交换
在这里,对于和哨兵相等的数,我们采取继续遍历,这里会导致一个问题,数组越界,所以需要设置边界。