1.在《數(shù)據(jù)結(jié)構(gòu)》這本書中快排的基本思想是以第一個(gè)數(shù)為哨兵,然后先從數(shù)組尾部遍歷,找到第一個(gè)比哨兵小的數(shù),將哨兵和這個(gè)數(shù)交換,記為hi;再從數(shù)組第一個(gè)地方開始遍歷,找到第一個(gè)比哨兵大的樹,將哨兵和這個(gè)數(shù)交換,記為lo。如果lo>=hi,那么這次快排到此結(jié)束。
在這里,對(duì)相同的數(shù)字采取了原地等待的方式,這也就是能保證遍歷找數(shù)字時(shí)候不會(huì)越界。這時(shí)候就會(huì)導(dǎo)致一個(gè)問題,如果nums[hi] == nums[lo] 而且nums[hi] == 哨兵,那么就會(huì)造成死循環(huán),沒有一個(gè)下標(biāo)會(huì)移動(dòng)。所以我們必須讓其中一個(gè)移動(dòng),如果兩個(gè)都移動(dòng),那么hi-lo==1時(shí)候,兩個(gè)指針就會(huì)完美錯(cuò)過
最后無論返回hi或者lo都是可以的
2.在《算法》這本書中快排的基本思想是以第一個(gè)數(shù)為哨兵,然后先從數(shù)組尾部遍歷,找到第一個(gè)比哨兵小的數(shù),停止遍歷,記為hi;再從數(shù)組第一個(gè)地方開始遍歷,找到第一個(gè)比哨兵大的樹,停止遍歷,記為lo。如果lo>=hi,那么這次快排到此結(jié)束,返回hi,否則交換hi和lo這兩個(gè)位置的數(shù)字。最后hi這個(gè)位置存放的仍然是比哨兵小的數(shù),所以應(yīng)該將哨兵和hi位置數(shù)字交換
在這里,對(duì)于和哨兵相等的數(shù),我們采取繼續(xù)遍歷,這里會(huì)導(dǎo)致一個(gè)問題,數(shù)組越界,所以需要設(shè)置邊界。