快速排序的注意事項

2021-10-02 11:33:45 字數 860 閱讀 5256

templatevoid quick_sort(iter begin, iter end) 

iter_swap(begin, e);

quick_sort(begin, e);

quick_sort(e + 1, end);

}

第一,等於的時候進不進行交換。

需要進行交換,理由就是盡量使得被target被交換到陣列的**;

問題就出現了,如何保證等於的時候,不會發生死迴圈;

第二,從頭遍歷還是從後遍歷。

從後遍歷,因為第一點等於的時候也要進行交換,所以向後遍歷最差情況也只是到第乙個元素的時候停止,此時遍歷的過程中是不需要加上while(i < j)的判斷的;

第三,迴圈外與begin交換的是b,還是e。

這裡是e,注意主要經過while (b < e)迴圈,e最後的位置一定保證是*begin最終的位置。

第四,可以將第三個while的b < e也去掉不。

可以,只要保證target(*begin)元素是中間值就好了,將中間元素,最後的元素和第乙個元素這三個值重新分配一下順序,使得其按中間值,最小值,最大值的順序重新排列,這樣就可以保證左右都可以不用檢驗了;

第五,考慮比較函式的話,如何使用cmp的問題;

stl中的存在比較函式的sort函式與不存在比較函式的sort函式是過載的關係,不是使用預設引數來實現的;(感覺模板的預設引數十分不靠譜,好像不能有預設引數,模板類可以有,但是模板函式的預設引數不可以)

問題在cmp預設是less,兩個引數t1,t2,只有t1 < t2時才返回true,所以要考慮等於的時候,可以使用如下方法轉化,先寫出《號的版本,如果是大於號,就將兩個變數轉換一下位置。最後,直接將《替換為cmp函式即可。

快速排序注意事項 兩種partition的方式

快速排序演算法的正確性的必要條件 取第乙個元素或最後乙個元素 最壞情況 陣列已經排好序 取首個元素 中間元素 最後乙個元素的中位數 三數取中,不是平均數!隨機取乙個元素 lomuto scheme private intpartition int array,int left,int right,i...

gitlab 快速安裝和注意事項

一 安裝步驟 官網快速安裝步驟 翻譯後的 二 出現以下問題 1 whoops,gitlab is taking too much time to respond.8080埠占用,或者記憶體過小,最小3g 三修改git 訪問ip vi etc gitlab gitlab.rb 修改external u...

java DOM 注意事項

1.w3c把標籤內的文字部分也定義成乙個node 2.element物件代表的是xml文件中的標籤元素 繼承於node,亦是node的最主要的子物件 3.attr實際上是包含在element中的,它並不能被看作是element的子物件,因而在dom中attr並不是dom樹的一部分,所以node中的 ...