內部排序總結及例項
前面介紹的
8種排序演算法(直接插入排序、折半插入排序、希爾排序、氣泡排序、快速排序、簡單選擇排序、堆排序、歸併排序)屬於建立在「比較」基礎上的排序演算法,通過決策樹已經證明,任何基於比較進行的排序演算法的時間複雜度不可能再優於
o(n*logn)
。後面2
種不是建立在比較的基礎上的
,因此,可以達到線性執行時間。
排序方法
最好時間複雜度
平均時間複雜度
最壞時間複雜度
空間複雜度
是否穩定
直接插入排序
o(n)
o(n*n)
o(n*n)
o(1) 穩定
折半插入排序
希爾排序
o(n) 不定
o(n*n)
o(1)
不穩定氣泡排序
o(n)
o(n*n)
o(n*n)
o(1) 穩定
快速排序
o(n*logn)
o(n*logn)
o(n*n)
o(logn)
不穩定簡單選擇排序
o(n*n)
o(n*n)
o(n*n)
o(1)
不穩定堆排序
o(n*logn)
o(n*logn)
o(n*logn)
o(1)
不穩定歸併排序
o(n*logn)
o(n*logn)
o(n*logn)
o(n) 穩定
計數排序
o(n+k)
o(n+k)
o(n+k)
o(k) 穩定
基數排序
o(d(n+k))
o(d(n+k))
o(d(n+k))
o(k) 穩定
桶排序o(n)
o(n)
o(n) 不定
取決於桶內
小結: 1、
在基於比較的排序方法中,就平均效能而言,快速排序最佳;
對於最一般的內部排序應用程式,選用的方法一般不是直接插入排序、希爾排序就是快速排序。 2、
歸併排序一般只用在小的或非常接近排好序的輸入資料上,因為需要o(n)的輔助空間,因此其效能對於主存排序不如快速排序那麼好,但是合併是外部排序的中心思想。
3、堆排序在排序元素較少時有點大材小用,待排序列元素較多時,堆排序還是很有效的。但
比希爾排序慢,儘管它是乙個帶有明顯緊湊內迴圈的o(n*logn)演算法。 4
、計數排序和
基數排序效率極高,需要額外的輔助空間,如果d或k很大,其效能對於主存排序來說就不太好了;計數排序和基數排序最適合於n很大,而k和d很小的情況。
ps:
時間複雜度為o(nlogn):
快速排序、希爾排序、歸併排序、堆排序 即:快些歸堆
不穩定:
快速排序、希爾排序、(簡單)選擇排序、堆排序 即:快些選堆
舉例:
1. 基本topk問題:從1百萬個數中找出最大(或最小)的5個數
看到這個問題,很多同學的第一反應會是:排序。那麼,選擇哪種排序方法呢,有同學說:快排,將所有數排序後,再選出最大的5個。雖然快排確實能解決這個問題,但是需要對1百萬個數排序,但我們僅僅需要其中的5個。那麼,有更好的方法嗎?
選擇類排序演算法,最大的特點就是能在一輪排序後獲得最終排序序列中位於指定位置的元素。比如,第一輪選擇類排序,就能選出最大(或最小)的數。可見,只需進行5輪選擇類排序即可達到題目要求。而使用快排,需要log(1百萬)輪partion。
選擇類排序,我們介紹了兩種:簡單選擇排序和堆排序。那麼,選哪個呢?當然是堆排序,時間效率更高。問題的答案顯而易見了:
第一步:建大頂堆,建堆後,最大元素位於堆頂。
第二步:將堆頂元素與最後乙個元素交換,調整堆頂。重複該過程四次。位於儲存堆的陣列倒數的五個數,即為最大的五個數。
我們通過乙個例子,來說明topk問題。從10,6,9,8,7,5中選出最大的兩個元素的過程如下圖:
(注:上面**的最後一步應該是交換9和7)。
2. 有10個檔案放在10臺機器上,每個檔案中有1百萬個數。要求選出這1000萬個數中最大的5個數。
看到這裡,有的同學就傻眼了。把數都分開放了,怎麼辦?分析: 1.只要最大的5個數,這5個數一定是在每個檔案中最大5個數合起來共50個數中。 2.先從每個檔案中選出最大的5個數(堆排序),然後都傳到一台機器上處理。問題變成,選出10個有序序列中最大的5個數。也就是有序序列的合併問題。 經過以上分析,我們找到了解決方法。 第一步,用「大頂堆」從10個檔案中分別選出最大的5個,傳到一台機器上; 第二步,將10個序列合併。可以設10個指標指向每個序列,每次通過9次比較選出最大的1個。共需要進行5輪,比較45次,即可選出最大的5個。
3. 有10個檔案放在10臺機器上,每個檔案中有1百萬個數。要求選出這1000萬個數中最大的50個數。
第三道題目與第二道題目非常相似,區別僅在於從5個數變成了50個數。那有什麼區別呢?第一步,與問題二完全相同,還是利用「大頂堆」進行。問題在於第二步,現在需要50個數,那就是450次比較。有沒有更好的方法呢。當然,答案就是「敗者樹」。什麼是敗者樹,為什麼要用敗者樹呢?
內部排序總結
排序方式 時間複雜度 空間複雜度 穩定性複雜性 平均情況 最壞情況 最好情況 直接插入排序 o n 2 o n 2 o n o 1 穩定簡單 希爾排序 o n 1.3 n 2 o 1 不穩定較複雜 氣泡排序 o n 2 o n 2 o n o 1 穩定簡單 快速排序 o nlog2 n o n 2 ...
排序演算法(內部排序)總結
排序是計算機應用中的乙個非常重要的操作。平常我們總會聽到一些演算法,但是我們總是似懂非懂的寫著 今天我將一般常見的排序演算法進行乙個總結。本次總結只涉及內部排序 所謂內部排序是指在記憶體中進行的排序 首先說乙個概念 穩定排序與非穩定排序 如果乙個序列中原來相同的元素,排序完成後,仍然保持著原來的順序...
排序總結 6 快速排序
快速排序是實踐中已知最快的排序演算法。基本思想 選取乙個樞紐元進行一趟快排,將比起小的元素放在左邊,比其大的元素放在右邊,然後遞迴的對左右兩部分分別進行快速排序即可。特點 注意幾點 1.如何選取樞紐元來避免最壞情景?2.如何進行資料分割,就是根據樞紐元進行一趟快排?3.小陣列的時候使用快排合適嗎?很...