qsort的每一趟中,選定pivot以后,partition的過程如下:
開始時,ptrLeft,ptrRight分別指向數組兩端;
*ptrLeft小于pivot時,向右走;*ptrRight大于pivot時,向左走;
ptrLeft和ptrRight都走不動的時候,交換對應的元素,繼續。
ptrLeft和ptrRight相遇的時候,結束這一趟,然后二分的對兩邊繼續qsort。
更新:這樣的做法需要處理各種特殊情況(略),因此更好的思路是:
partition 的時候,思路是:
1 ,將 pivot 放到序列末尾;
2 ,兩個指針 ptr_old_curr 、 ptr_new_curr 從左向右掃描,如果 *ptr_old_curr <= pivot ,就交換到 ptr_new_curr 位置;換言之, ptr_new_curr 一直指向下一個位置;
3 , ptr_old_curr 到達末尾后, ptr_new_curr 指向第一個大于 pivot 的位置,將 pivot 放回這個位置即可。
這樣的好處是:完全不需要判斷各種異常情況。 一個實現參見 http://www.cnblogs.com/qsort/archive/2011/08/30/2155923.html
?
查找第k小的數,可以利用qsort中的partition來一次去掉大概一半。
思想如下:Find(k, Left, Right)的時候,先選擇一個pivot,來Partition(Pivot, Left, Right)
之后,設Pivot所在位置為Middle,可知Pivot左側都比Pivot小,右側都比Pivot大。
如果左側有大于k個數,那么第k小的數肯定在左側,可以繼續Find(k, Left, Middle)
如果左側數字小于k個,那么第k小的數肯定在右側,而且是右側的第 (k - (Middle - Left + 1) )個數,可以繼續Find([k - (Middle - Left + 1)], Middle, Right)了。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
