排序比較
優化快速排序
- 快速排序的最壞時間複雜度是O(n2);緣由是數據是有序或接近有序的,而每次區分點都選最後一個,則須要交換次數太多,時間複雜度就會退化到O(n2)。 所以這種時間複雜度出現的主要緣由仍是分區點選的不夠合理。 比較經常使用簡單的分區算法:1.三數取中法;2.隨機發
- 快速排序使用遞歸實現的,就可能出現棧溢出的問題。解決辦法:1.限制遞歸深度;2.經過在堆上模擬實現一個函數調用棧,手動模擬遞歸壓棧、出棧的過程,這樣就沒有了系統棧大小的限制。
排序函數
C中qsort()函數的實現: qsort優先使用歸併排序,若是數據量過大的話,再使用快速排序;算法
快排的分區點的選擇是「三數取中法」;函數
對於遞歸太深致使棧溢出的問題,qsort是經過本身實現一個堆上的棧,手動模擬的。優化
在遞歸的過程當中,當要排序的數據區間中,元素個數<=4時,退化爲插入排序,再也不用遞歸(在小規模數據的狀況下,O(n2)和O(nlogn)就差很少了)。cdn
所以實際的排序函數,具體狀況具體分析。blog