快速排序的四種優化方式
本文只講述概念。
選用基準值(不在四種優化方式中)
選用基準值有三種方式,選用的基準值較好,快速排序的性能也會較好。
- 固定基準(也就是從begin的位置,作爲排序的基準,沒有一點優化,簡單的快排方式都是這樣)
- 隨機基準(和固定基準差不多)
- 三數取中,這個基準就稍微優化了一些,從一堆數據中隨機找出三個數據,把中間數據作爲基準值,可以說是進行了稍微的優化。
下面講一下四種優化方式
1. 當數據量到達一定大小是,選擇使用插入排序或者堆排序
插入排序
當遞歸之後序列到達某一大小時,相對每個遞歸數組中的數據元素較少(一般<=16時),在使用遞歸顯然會增加遞歸的深度,所以可以選用直接插入排序,降低遞歸深度,提高運算效率。
堆排序
當遞歸進行了較深的深度之後,但是每個遞歸數組中的元素還是較多,這是可以採用堆排序,從而降低遞歸深度,提排序性能。
2. 使用尾遞歸的方式進行內存優化
尾遞歸:簡單理解就是,本次遞歸調用不會對主調函數中的任何變量數據產生影響。尾遞歸就是在主調函數的堆棧空間上重新使用該塊空間,進行遞歸調用。
可以將快速排序的遞歸調用改爲尾遞歸的方式,提高效率。
3. 聚集元素
在每次排序排完之後,可以將與基準值相同的元素放在基準值的左右兩邊,這樣就可以是下次排序直接從這些基準值的左邊和右邊進行排序即可。
第一趟:[7] [2] [3] [1] [7] [4] [7] [9] [7] [8]
可以將其更改爲:[4] [2] [3] [1] [7] [7] [7] [7] [9] [8]
第二趟就可以左邊直接從1開始,右邊直接從9開始,這樣大大降低了重複元素在快排中消耗時間的額外開銷。
4. 多線程排序
多線程排序需要使用到線程函數《pthred》,通過創建線程,給每個線程分配數據,然後每個線程內部進行排序,最後進行整合的方式達到排序效果。
- 首先將大數據分成若干份,分配給每個線程。
- 將每個線程的內部數據進行快速排序,使每個線程內部有序。
- 然後在進行將這多個線程內部的數據進行合併,可以使用歸併排序合併數據的方式。