10.5 歸併排序
歸併排序的基本思想是:將兩個或兩個以上的有序子串行「歸併」為乙個有序序列。
在內部排序中,通常採用的是2-路歸併排序。即:將兩個位置相鄰的有序子串行
43_001
void merge(elem sr, elem tr, int i, int m, int n)
if(i <= m)
tr[k,..n] = s[i,...m]; //將剩餘的sr[i,...m]複製到tr
if(j <= n)
tr[k,..n] = s[j,...n]; //將剩餘的sr[j,...n]複製到tr
}//merge
歸併排序的演算法
如果記錄無序序列r[s,…t]的兩部分
分別按關鍵字有序,則利用上述歸併演算法很容易將它們歸併成整個記錄序列是乙個有序序列,由此,應該先分別對這兩部分進行2-路歸併排序。
例如:52,23,80,36,68,14 (s=1,t=6)
[52,23,80],[36,68,14]
[52,23][80],[36,68][14]
[52][23] ,[36][68]
[23,52] ,[36,68]
[23,52,80],[14,36,68]
[14,23,36,52,68,80]
43_003
void msort(elem sr, elem tr1, int s, int t)
}//msort
void mergesort(elem r)
//mergesort
容易看出,對n個記錄進行歸併排序的時間複雜度為o(nlogn)。即:每一趟歸併的時間複雜度為o(n),總共需進行趟。
10.6 基數排序
借助「多關鍵字排序」的思想來實現「單關鍵字排序」的演算法。
一、多關鍵字排序
n個記錄序列對關鍵有序是指:對於序列中任意兩個記錄ri和rj ,(1<=i<=j<=n)都滿足下列(詞典)有序關係: 其中
實現多關鍵字排序通常有兩種做法:
最高位優先msd法:先對k0
進行排序,並按k0
的不同值將記錄序列分成若干子串行之後,分別對k1
進行排序,…,依次類推,直至最後對最次位關鍵字排序完成為止。
最低位優先lsd法:先對
kd-1
進行排序,並按
kd-2
的不同值將記錄序列分成若干子串行之後,分別對k0
進行排序,…,依次類推,直至最後對最次位關鍵字排序完成為止。
排序過程中不需要根據「前乙個」關鍵字的排序結果,將記錄分割成若干個(「前乙個「關鍵字不同的)子串行。
例如:學生記錄含三個關鍵字:系別、班號和班內的序列號,其中以系別為最主關鍵字。lsd的排序過程如下:
二、鏈式基數排序
假如多關鍵字的記錄序列中,每個關鍵字的取值範圍相同,則按lsd法進行排序時,可以採用「分配-收集」的方法,其好處是不需要進行關鍵字間的比較。
對於數字型或字元型的單關鍵字,可以看成是由多個數字或多個字元構成的多關鍵字,此時可以採用這種「分配-收集」的辦法進行排序,稱作基數排序法。
例如對下列這組關鍵字
首先按其「個位數」取值分別為0,1,…,9「分配」成10組,之後按從0至9的順序將它們「收集」在一起,然後按其「十位數」取值分別為0,1,…,9「分配」成10組,之後在按從0至9的順序將它們「收集」在一起;最後按其「百位數」重複一邊上述操作,便可得到這組關鍵字的有序序列。
在計算機上實現基數排序時,為減少所需輔助儲存空間,應採用鍊錶作儲存結構,即鏈式基數排序,具體做法為: 1.
帶排序記錄以指標相鏈,構成乙個鍊錶; 2.
「分配」時,按當前「關鍵字位「索取值,將記錄分配到不同的「鏈佇列」中,每個佇列中記錄的「關鍵字位」相同。 3.
「收集」時,按當前關鍵字位取值從小到大將各佇列首尾相鏈成乙個鍊錶。 4.
對每個關鍵字均重複2和3兩步
1.「分配」和「收集」的實際操作僅為修改鍊錶中的指標和設定佇列的頭、尾指標;
2.為查詢使用,該鍊錶尚需應用演算法arrange將它調整為有序表。
基數排序的時間複雜度為o(d(n+rd)),其中分配為o(n);收集為o(rd)(rd為「基」),d為「分配-收集」的趟數
10.7各種排序方法的綜合比較
一、時間效能
1.平均的時間效能
時間複雜度o(nlogn):快速排序、堆排序和歸併排序
時間複雜度為
o(n2
):直接插入排序、起泡排序和、簡單選擇排序
時間複雜度為o(n):基數排序。 1.
當待排記錄序列按關鍵字順序有序時,直接插入排序和起泡排序能達到o(n)的時間複雜度,快速排序的時間效能蛻化為
o(n2)
2.簡單選擇排序、堆排序和歸併排序的時間效能不隨記錄序列中關鍵字的分布而改變。
二、空間效能
指的是排序過程中所需的輔助空間大小。 1.
所有的簡單排序方法(包括「直接插入、起泡和簡單選擇)和堆排序的空間複雜度為o(1); 2.
快速排序為o(logn),為棧所需的輔助空間; 3.
歸併排序所需輔助空間最多,其空間複雜度為o(n);
4.鏈式基數排序所需附設佇列首尾指標,怎空間複雜度為o(rd);
三、排序方法的穩定性能
1.穩定的排序方法指的是,對於兩個關鍵字相等的記錄,它們在序列中的相對位置,在排序之前和經過排序之後,沒有改變。
例如:
(56,34,47,23,66,18,82,47)
(18,23,34,47,47,56,66,82) 穩定的
(18,23,34,47,47,56,66,82) 不穩定的
1.當對多關鍵字的記錄序列進行lsd方法排序時,必須採用穩定的排序方法。 2.
對於不穩定的排序方法,只要能舉出乙個例項說明即可。 3.
快速排序、堆排序和希爾排序是不穩定的
學習 嚴蔚敏講資料結構筆記09
1.2 串的表示和實現 如果在程式語言中,串只是作為輸入或輸出的常量出現,則只需儲存此串的串值,即字串行即可。但在多數非數值處理的程式中,串也以變數的形式出現。一 串的定長順序儲存表示 二 串的堆分配儲存表示 三 串的塊鏈儲存表示 一 串的定長順序儲存表示 define maxstrlen 255 ...
資料結構 嚴蔚敏
最近一直想找一本純資料結構的書來學習,找來找去都沒有找到一本合適的書籍,相比之下國內的書籍之中,嚴蔚敏和吳偉民的還算是經典版了,很多國內其他資料結構教材都參考這本書的。但缺點是很多都是偽 對程式設計初學者來說有一些難度,甚至有些考研的同學來看這本書有很多還看不懂,並且裡面也有些容易迷惑人的地方。出於...
資料結構(嚴蔚敏)
說起為什麼重新拿起這本書,著實非常慚愧。是因為面試的時候,第乙個面試官面試完專案之後。第二面試官說我們就當聊聊天,考考資料結構,演算法就好了。結果以乙個問題就把我難住了,這個問題是 雜湊表是什麼?所以我打算花兩天的時間重新把這本書看一遍,並做下筆記,這次我一定會記住。目前,計算機已深入到社會生活的各...