如何優化冒泡排序和快排?

冒泡排序的優化: 1:加入哨兵 2:記住每一次交換的最後位置,該位置之後的爲有序,不須要改變。
快排的優化:
	1.當待排序序列的長度分割到必定大小後,使用插入排序。緣由:對於很小和部分有序的數組,快排不如插排好。當待排序列的長度分割到必定大小後, 繼續分割的效率比插入排序要差,此時可使用插排而不是快排。

	2.在一次分割結束後,能夠把與Key相等的元素聚在一 起,繼續下次分割時,再也不對與key相等元素分割。具體過程:在處理過程當中,會有兩個步驟:
 第一步,在劃分過程當中,把與key相等元素放入數組的兩端。
 第二步,劃分結束後,把與key相等的元素移到樞軸周圍。

	3.三數取中:中軸數的選取:最佳的劃分是將待排序的序列分紅等長的子序列,最佳的狀態咱們可使用序列的中間的值,也就是第N/2個數。但是,這很難算出來,而且會明顯減慢快速排序的速度。這樣的中值的估計能夠經過隨機選取三個元素並用它們的中值做爲樞紐元而獲得。事實上,隨機性並無多大的幫助,所以通常的作法是使用左端、右端和中心位置上的三個元素的中值做爲樞紐元。顯然使用三數中值分割法消除了預排序輸入的很差情形,而且減小快排大約14%的比較次數。

	4.優化遞歸操做
快排函教在函數尾都有兩次遞歸操做,咱們能夠對其使用尾遞歸優化。
優勢:若是待排序的序列劃分極端不平衡,遞歸的深度將趨近於n,而棧的大小是頗有限的,每次遞歸調用都會耗費必定的棧空間,函數的參數越多,每次遞歸耗費的空間也越多。優化後,能夠縮減堆棧深度,由原來的O(n)縮減爲logn。

歸納:這裏效率最好的快排組合是:三數取中+插排+彙集相等元素,它和STL中的Sort函數效率差很少。
相關文章
相關標籤/搜索