軟件設計師教程第3章數據結構

數據結構按照邏輯關係分爲線性結構和非線性結構兩大類,其中,非線性結構又可分爲樹結構和圖結構。

3.1線性結構

線性結構是一種基本的數據結構,主要用於對客觀世界中具有單一前驅和後驅的數據關係進行描述。線性結構的特點是數據元素之間呈現一種線性關係,即元素“一個接一個排列”

3.1.1線性表

線性表示最簡單、最基本也是最常見的一種線性結構。常採用順序存儲和鏈式存儲,主要基本操作就是插入、刪除和查找。

1.線性表的定義

一個線性表示n個元素的有限序列,通常表示爲(a1,a2,a3.....an)。非空線性表的特點如下。

(1)存在唯一的一個稱作“第一個”的元素。

(2)存在唯一的一個稱作“最後一個”的元素。

(3)除第一個元素外,序列中的每一個元素均只有一個直接前驅。

(4)除最後一個元素外,序列中的每一個元素只有一個直接後驅。

2.線性表的存儲結構

線性表的存儲結構分爲順序存儲和鏈式存儲

1)順序存儲是是指用一組地址連續的存儲單元依次存儲線性表中的數據元素。

2)線性表的鏈式存儲

a.單向鏈表,每個節點中只有指向下一個節點的地址

b.雙向鏈表

c.循環鏈表

d.靜態鏈表

3.1.2棧和列隊

1.棧 

先進後出

2.列隊

先進先出

3.1.3串

串(字符串)是一種特殊的線性表,其元素爲字符。

樸素的模式匹配算法和KMP模式匹配算法

3.2數組、矩陣和廣義表

3.2.1數組

數組是定長線性表在維數上的擴展,即線性表中的元素又是一個線性表

3.2.2矩陣

矩陣是很多科學與工程計算領域研究的數學對象。在數據結構中,主要討論如何在節省存儲空間的情況下使用矩陣的各種運算能高效的進行。

1.特殊矩陣

若矩陣中元素(或非0元素)的分佈有一定的規律,則稱之爲特殊矩陣。常見的特殊矩陣有對稱矩陣、三角矩陣和對角矩陣等。

2.稀疏矩陣

在一個矩陣中。若非0元素的個數遠遠少於0元素的個數,且非0元素的分佈沒有規律,則稱之爲稀疏矩陣。

3.2.3廣義表

廣義表是線性表的推廣,是由0個或多個單元素或字表組成的有限序列。

3.3樹

樹結構是一種非常重要的非線性結構,該結構中的一個元素可以由兩個或兩個以上的直接後繼元素,樹可以用來描述客觀世界中廣泛存在的層析結構關係。

3.3.1樹與二叉樹的定義

1.樹的定義

樹是m(m>=0)個節點的有限集合,當m=0時稱爲空樹。在任一個非空樹種,有且僅有一個稱爲根的節點;其餘節點可分爲n個互不相交的有限子集。

2.樹的基本概念

(1)雙親、孩子、兄弟。節點的自述的根稱爲該節點的孩子:相應地,該節點稱爲其子節點的雙親。具有相同雙親的節點互爲兄弟。

(2)節點的度。一個節點的子樹的個數稱爲該節點的度。

(3)葉子節點。葉子節點稱爲終端節點。

(4)內部節點 度不爲0的節點,也稱爲分支節點或非終端節點。

(5)節點的層次,根節點爲第一層,一次類推

(6)樹的高度 一棵樹的最大層次樹記爲樹的高度

(7)有序(無序)樹,若將書中節點的各子樹看成是從左到右一次有序的,即不能交換,則稱爲有序樹,否則稱爲無序樹。

3.二叉樹的定義

二叉樹與樹的區別:二叉樹中節點的子樹要區分左子樹還是右子樹,即使在節點只有一個樹的情況下,也要指出是左子樹還是右子樹,另外,二叉樹的最大度爲2,而樹的節點的度不做限制。

3.3.2二叉樹的性質和存儲結構

1.二叉樹的性質

(1)二叉樹第i層上最多有2^i-1個節點。

(2)高度爲k的二叉樹最多有2^K  -1 節點。

(3)對於任一二叉樹,若其終端節點的個數爲n,度爲2 的節點個數爲m ,則n=m+1

(4)具有n個節點的滿二叉樹的深度爲log2n+1

2.二叉樹的存儲結構

1)二叉樹的順序存儲結構

順序存儲結構是用一組連續的存儲單元存儲二叉樹中的節點,必須把節點排成一個適當的線性序列,並且節點在這個序列的相互位置能反映出節點之間的邏輯關係。

對於一個深度爲k的完全二叉樹,首先講一下什麼叫完全二叉樹:

有n個結點的二叉樹,當且僅當其每一個結點都與深度爲K的滿二叉樹中編號從1至n的結點一一對應時稱之爲完全二叉樹.

對於完全二叉樹,如果數組下標識從1開始的,

則有a[i]的左子樹根節點爲啊a[2i],右子樹的根節點爲a[2i+1],用一個數組可以連續的表示完全二叉樹,

對於一般的二叉樹用數組結構來表示,會浪費很多空間。

2)二叉樹的鏈式存儲結構

由於二叉樹的節點中包含有數據元素、左子樹的根、右子樹的根及雙親等信息,因此可以使用三叉鏈表或二叉鏈表(即一個節點含有3個指針或2個指針)來存儲二叉樹,鏈表的頭指針指向二叉樹的根節點。

3.3.3二叉樹的遍歷

(1)使用遞歸來遍歷:

1.先序遍歷 ,先遍歷根節點

2.中序遍歷,先訪問左節點,再訪問根節點

3.後續遍歷,最後訪問根節點

(2)二叉樹的非遞歸遍歷:

利用輔助棧來完成遍歷

(3)二叉樹的層序遍歷算法

自上而下、自左至右逐層訪問樹種各節點的過程就是層序遍歷

3.3.4 線索二叉樹

1.線索二叉樹的定義

而叉樹的遍歷實質上是對一個非線性結構進行線性化的過程,它使得每個節點在這些線性序列中有且僅有一個直接前驅和後驅。但在二叉樹鏈表存儲結構中,只能找到一個節點的左、右孩子,不能直接得到節點在任一遍歷中的前繼和後繼,這些信息只有在遍歷的動態過程中才能得到,因此,引入線索二叉樹來保存這些動態過程中得到的信息。

2.建立線索二叉樹

ltag lchild data rchild rtag

其中 ltag爲0時,lchild指向節點的左孩子,ltag爲1時,lchild指向節點的直接前驅

rtag爲0時,rchild指向節點的右孩子,rtag爲1時,rchild指向節點的直接後繼

3.訪問線索二叉樹

以中序二叉樹爲例,

(1)若p->rtag爲1,則rchild爲直接後繼節點

(2)若p->rtag爲0,則之間後繼節點則爲右子樹中“最左下”的節點。

3.3.5最優二叉樹

最優二叉樹又稱哈夫曼樹,它是一類帶權路徑長度最短的樹,路徑是從樹的一個節點到另一個節點之間的通路,路徑上的分支樹目稱爲路徑的長度。

樹的路徑長度是從根節點到每一個葉子之間的路徑長度的總和,節點的帶權路徑長度爲從該節點到樹根之間的路徑長度與該節點權值的乘積

樹的帶權路徑長度爲書中所有葉子節點的帶權路徑長度之和,

wpl = w1*k1+w2*k2+.....wn*kn

其中,n爲帶權葉子節點的數目,w爲權值,k爲葉子節點到根節點的權值。

那麼如何構造最優二叉樹呢?構造最優二茶水壺的哈夫曼算法如下。

(1)根據給定的n個權值{w1,w2....,wn},構成n棵二叉樹的集合F={T1,T2,.....Tn},其中每棵樹Ti中只有一個帶權的爲wi的

根節點,其左、右子樹均空。

(2)在F中選取兩棵權值最小的樹作爲左、右子樹構造一顆新的二叉樹,置新構造的二叉樹的根節點的權值爲其左、右子樹根節點的權值之和。

(3)從F中刪除這兩棵樹,同時將新得到的二叉樹加入到F中。

2.哈夫曼編碼

若對每個字符編制相同長度的二進制碼,則稱爲等長碼,等長碼實現簡單,但是浪費空間

如果要設計長度不等的編碼,必須滿足下面的條件:任一字符的編碼都不是另一個字符的編碼的前綴,這種編碼也稱爲前綴碼,

可利用哈夫曼最優二叉樹可以實現前綴碼

左分支標0,右分支標1,則每個葉子節點代表的字符的編碼就是從根節點到葉子節點路徑上0、1組成的串。

3.3.6樹和森林

森林就是有多個樹,其他略

3.4圖

圖是比樹結構更爲複雜的一種數據結構。在線性結構中,除首節點沒有前驅,末節點沒有後繼外,一個節點只有唯一一個直接前驅和一個直接後驅。在樹結構中,除根節點沒有前驅節點外,其餘的節點只有唯一一個前驅(雙親節點)和多個後繼節點。而在圖中,任意兩個節點之間都可能有直接的關係,所以圖中的一個節點的前驅節點和後驅節點時沒有限制的。

3.4.1圖的定義與存儲

1.圖的定義

(1)有向圖,若圖中每條邊都具有方向的,那麼有向邊稱爲弧,有向邊的起點稱爲弧爲,有向邊的重點稱爲弧頭。

(2)無向圖,每條邊都是無方向的。

(3)完全圖,每個節點之間都有邊

(4)度、出度和入度。節點的度,表示關聯該節點邊的數目,出度是指有向邊的起點爲該節點的邊的數目,類似的入度是終點。

(5)路徑。

(6)子圖,包含的關係

(7)連通圖與連通分量。在無向圖中任意兩點都是連通的,連通是指有路徑。

(8)強連通和強連通分量。在有向圖中任意兩典都是連通的。

(9)網。邊(弧)帶權值的圖稱爲網

(10)有向樹。如果有一個圖恰好有一個頂點的入度爲0,其餘頂點的入度均爲1,則是一個有向樹。

2.圖的存儲結構

1)鄰接矩陣表示法

n個節點的圖用n階的方陣來表示

2)鄰接鏈表表示法

存儲方法跟樹的孩子鏈表示法相類似,是一種順序分配和鏈式分配相結合的存儲結構。如這個表頭結點所對應的頂點存在相鄰頂點,則把相鄰頂點依次存放於表頭結點所指向的單向鏈表中

3.4.2圖的遍歷

圖的遍歷是指從某個頂點出發,沿着某條路徑對圖中的所有頂點進行訪問且只訪問一次的過程。

1.深度優先搜索(depth first search,DFS)

此種方法類似於樹的先序遍歷,在第一次經過一個頂點時就進行訪問操作。從圖G中任一節點v出發按深度優先搜索法進行遍歷的步驟。

(1)設置搜索指針怕,使p指向頂點v。

(2)訪問p所指頂點,並使p指向與其相鄰的且尚被訪問過的頂點。

(3)若p所指頂點存在,則重複步驟(2),否則執行步驟(4)。

(4)沿着剛纔訪問過的次序和方向回溯到一個尚有鄰接頂點且未訪問過的頂點,並使p指向這個爲訪問過的頂點,然後重複步驟(2),直到所有的頂點均被訪問到。

2.廣度優先搜索(Breadth First search)

圖的廣度優先搜索方法爲:從圖中的謳歌頂點v出發,在訪問v之後一次訪問v的各個未被訪問過的鄰接點,然後分別從這些鄰接點出發一次訪問他們的鄰接點,並使“先被訪問的頂點的鄰接點”先於“後被訪問的頂點的鄰接點”被訪問,直到圖中所有的已被訪問的頂點的鄰接點都被訪問到。若此時還有未被訪問的頂點,則另選一個爲被訪問的頂點爲起點,重複上述過程。直到所有的釘釘都被訪問到爲止。

3.4.3生成樹及最小生成樹

1.生成樹的概念。

對於有n個頂點的連通圖,至少有n-1條邊,而生成樹種恰好有n-1條邊,所以連通圖的生成樹是該圖的極小連通子圖。若在圖的生成樹種任意加一條邊,則必然形成迴路。

2.最小生成樹

對於連通網來說,邊是帶權值的,生成樹的各邊也帶權值,因此把生成各邊的權值總和稱爲生成樹的權,把權值最小的生成樹稱爲最小生成樹。求解最小生成樹有許多實際的應用。

(1)普里姆(Prim)算法

(2)克魯斯卡爾(Kruskal)算法

3.4.4拓撲排序的關鍵路徑

1.AOV網

在AOV網中不應愛出現有向環。

2.拓撲排序及其算法

3.AOE網

在帶權的有向圖G中以頂點表示事件。

4.關鍵路徑和關鍵活動

3.4.5最短路徑

1.單源點最短路徑

2.每對頂點間的最短路徑

3.5查找

3.5.1查找的基本概念

1.基本概念

查找是一種常用的基本運算。查找表是指同一類型的數據元素(或記錄)構成的集合。由於集合中的數據元素之間存在着完全鬆散的關係,因此,查找表是一種非常靈活的數據結構。

對查找表經常要進行的兩種操作如下。

(1)查詢某個特定的數據元素是否在查找表中。

(2)檢索某個特定的數據元素的各種屬性。

通常將進行這兩種操作的查找表稱爲靜態查找表。

對查找表經常要進行的另外兩種操作如下。

(1)在查找表中插入一個元素。

(2)在查找表中刪除一個數據元素。

若需要在查找表中插入一個不存在的數據元素,或者從查找表中刪除已存在的某個數據元素,則稱此類查找表爲動態查找表。

關鍵字是數據元素(或記錄)的某個數據項的值,用它來識別這個數據元素。主關鍵字是指唯一標識一個數據元素的關鍵字。次關鍵字是指能標識多個數據元素的關鍵字。

2.平均查找長度

對於查找算法來說,其基本操作是“將記錄的關鍵字與給定值進行比較”。因此,通常以“其關鍵字和給定值進行比較的記錄個數的期望值”作爲衡量查找算法好壞的依據。

爲確定記錄在查找表中的位置,需要給定關鍵字值進行比較的次數的期望值稱爲其算法在查找成功時的平均查找長度。

相當於查找每一個元素的權值和

3.5.2靜態查找表的查找方法

1.順序查找

即一個一個按順序查找。平均查找長度爲(n+1)/2

2.折半查找

前提是,關鍵字以按大小順序排序了,平均查找長度爲log2(n+1)+1

3.分塊查找

分塊查找又稱爲索引順序查找,是對順序查找方法的一種改進其效率介於順序查找與折半查找之間。

在分塊查找的過程中首先將表分成若干塊,每塊的關鍵字不一定有序,但塊與塊之間是有序的,即後一塊中所有記錄的關鍵字均大於前一個塊中最大的關鍵字,此外,還建立了一個“索引表”,索引表按關鍵字有序排列。

3.5.3動態查找表

1.二叉排序樹

1)二叉排序樹的定義

二叉排序樹又稱爲二叉查找樹,若非空有一下性質

(1)若它的左子樹非空,則左子樹上所有節點的值均小於根節點的值

(2)若它的右子樹非空,則右子樹的所有節點的值均大於根節點的值

(3)左。右子樹本身就是二叉排序樹

2)二叉排序樹的查找過程

3)在二叉排序樹中插入節點的操作

二叉排序樹是通過依次輸入數據元素並把它們插入到二叉樹的適當位置構造起來的,具體的過程是:每讀入一個元素,建立一個新節點。若二叉樹非空,則將新節點的值與根節點的值相比較,如果小於根節點的值,則插入到左子樹,否則插入到右子樹;若二叉排序樹爲空,則新節點走位二叉排序樹的根節點。

4)在二叉排序樹種刪除節點的操作。

(1)若節點p爲葉子節點且p不是根節點,因此此時刪除p不會破壞樹的結構,只需將p的雙親節點原來指向p的指針現在指向NULL。

(2)若p只有左子樹或右子樹且不是根節點。此時只需將p的雙親節點原來指向p的指針現在指向p的左子樹或右子樹。

3)若p的節點的左右子樹都存在,則刪除p節點時應將其左子樹、右子樹連接到適當的位置,並保持二叉排序樹的有序的特性。可採用以下兩種方法處理:一是p的左子樹爲p的雙親節點的左子樹,而將p的右子樹下接到中序遍歷是p的直接前驅及節點(p的左子樹中最右下方的節點)的右孩子指針上;二是用p的中序直接前驅代替p節點,然後在刪除替換後的p節點。

2.平衡二叉樹

平衡二叉樹又稱爲AVL樹,它或者是一棵空樹,或者具有以下性質的二叉樹。

1)它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的高度差的絕對值不會超過1.

2)若將二叉樹節點的平衡因子(balance factor,BF)定義爲該節點左子樹的高度減去右子樹的高度,則平衡二叉樹上所有的節點的平衡因子只可能是-1、0和1.只要樹上有一個節點的平衡因子的絕對值大於1,則該二叉樹就是不平衡的。

分析二叉排序樹的查找過程可知,只有在樹的形態比較均勻的情況下,查找的效率才能達到最佳,因此,希望在構造二叉排序樹的過程中,保持其爲一顆平衡二叉樹。

使二叉樹排序樹保持平衡的基本思想是:每當在二叉排序樹中插入一個節點時,首先檢查是否因插入破壞了平衡,若是,則超出其中最小不平衡二叉樹,在保持二叉排序樹特性的情況下,調整最小不平衡子樹中節點之間的關係,以達到新的平衡,所謂最小不平衡子樹,是指離插入節點最近且以平衡因子的絕對值大於1節點作爲根的子樹。

1)平衡二叉樹上的插入操作

一般情況下,假設由於在二叉排序樹上插入節點而失去平衡的最小樹根節點的指針爲a,也就是說,a爲最小不平衡子樹

(1)LL型單向右旋平衡處理

(2)RR型單向左旋處理

(3)LR型先左後右雙向旋轉平衡處理。

(4)RL型先右後左雙向旋轉平衡處理。

2)平衡二叉樹上的刪除操作

在平衡二叉樹上進行刪除操作比插入操作更復雜。若待刪除節點的兩個子樹都不爲空,就用該機誒單左子樹上的中序遍歷的最後一個節點(或其右子樹上的第一個節點)替換該節點,將情況轉化爲待刪除的節點只有一個子樹後再進行處理,當一個節點被刪除後,從被刪除節點到樹根的路徑上所有節點的平衡因子都需要更新,對於每一個該路徑上的平和因子大於2的節點來說都需要進行平衡處理。

3.B_樹

一顆m階的B_樹,或者爲空樹,或滿足一下特性的m叉樹

(1)樹中每個節點最多有m棵子樹

(2)若根節點不是葉子節點,則最少有兩棵子樹。

(3)除根之外的所有非終端節點最少有[m/2]棵子樹。

(4)所有非終端的節點包含下列數據信息

(n,A0,K1,A1,K2....Kn,An),其中,K爲關鍵字且Ki<Ki+1;A爲指向子樹根節點的指針,且指針Ai-1所指子樹中所有節點的關鍵字均小於Ki,An所指子樹中所有節點的關鍵字均大於Kn,n爲節點中關鍵字的個數且滿足[m/2]-1<n<m-1。

(5)所有的葉子節點都出現在同一層次上,並且不帶信息(可以看作是外部節點或查找失敗的節點,實際上這些節點不存在,指向這些節點的指針爲空)

B_樹上的插入和刪除運算較爲複雜,因爲要保證運算節點中關鍵字的個數等符合要求。

3.5.4哈希表

1.哈希表的定義

哈希表通過計算以記錄的關鍵字爲自變量函數來得到該記錄的存儲地址,所以在哈希表中進行查找操作時,需要同一哈希函數計算的到存儲地址。然後在存儲地址內查找。

對於哈希表,主要考慮兩個問題:一是如何構造哈希函數,而是如何解決衝突。

2.哈希函數的構造方法

應解決好兩個主要問題

(1)哈希函數應是一個壓縮映像函數,它應該具有較大的壓縮性,以節省存儲空間。

(2)哈希函數應該具有較好的散列性,雖然衝突是不可避免的,但應該儘量避免。

3.處理衝突的方法

(1)開放地址法

線性探測法

(2)鏈地址法

(3)再哈希法

(4)建立一個公共溢出區

4.哈希表的查找

與其他類似

3.6排序

3.6.1排序的基本概念

假設含n個記錄的文件內容爲{R1,R2,....Rn},相應地關鍵字爲{k1,k2,...kn}。進過排序確定一種排列,使得關鍵字滿足遞增或遞減。

若在待排序的序列中,Rj和Ri的關鍵字相同,且排序前Ri領先於Rj,那麼在排序後,如果Ri和Rj的相對次序保持不變,則稱此類排序方法時穩定的。否則稱爲不穩定的。

(1)內部排序,內部排序指帶排序機率全部存放在內存中進行的排序的過程。

(2)外部排序,外部排序指待排序記錄的數量很大,以至於內存不能容納全部機率,在排序過程中尚需爲外村進行訪問的排序過程。

3.6.2簡單排序

1.直接插入排序

直接插入排序是一種簡單的排序方法,具體的做法是:在插入第i個記錄時,R1、R2..Ri-1已經排好序,這時將R的關鍵字ki依次與關鍵字ki-1、ki-2等進行比較,從而找到應該插入的位置並將Ri插入,插入位置及其後的記錄依次向後移動。

最好情況下,比較次數爲n-1次,移動次數爲0

最壞情況下,比較次數爲n*(n-1)/2,移動的次數爲(包括中間變量的賦值)爲(n+3)*(n+2)/2。

時間複雜度爲O(n^2),空間複雜度爲O(1),是一種穩定的排序。

2.冒泡排序

方法是:首先將第一個記錄的關鍵字和第二個關鍵字進行比較,若爲逆序,則交換,侯然第二個記錄與第三個記錄比較,若爲逆序,再交換,依次類推,直到n-1和n比較位置。這樣是一趟冒泡排序,結果是,最大的記錄被交換到了n的位置,然後進行第二趟n-1.

時間複雜度爲O(n^2),空間複雜度爲O(1)

3.簡單選擇排序

通過n-i(1<=i<=n)次關鍵字之間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i個記錄進行交換,當i等於n時所有記錄有序排列。就是找最小關鍵字的下標。

時間複雜度爲O(n^2),空間複雜度爲O(1),是一種不穩定的排序。

3.6.3希爾排序

希爾排序又稱爲“縮小增量排序”,它是對直接插入排序的改進。

基本思想是:先將真個待排記錄序列分割成若干個子序列,然後分別進行直接插入排序,帶真個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序。先取一個小於n的整數d1作爲第一個增量,把全序列分成d1組,直到di=1時,即所有的記錄整體有序。

希爾排序是一種不穩定的排序方法,根據統計分析其時間複雜度約爲O(n^1.3),在排序過程中,僅需要一個元素的輔助空間用於數組元素值得交換,空間複雜度爲O(1)。

3.6.4快速排序

快速排序的基本思想是:通過一趟排序將待排的記錄劃分爲兩個獨立的兩部分,稱爲前半區和後半區,其中前半區中記錄的關鍵字不大於後半區記錄的關鍵字,然後分別對這兩部分記錄繼續使用快速排序,從而使整個排序有序。

一趟快速排序的過程稱爲一次劃分,具體做法是:附設兩個位置指示變量i和j,他們的初始值分別指向序列的第一個記錄和最後一個記錄,設樞軸記錄(通常是第一個記錄)的關鍵字爲pivot,則首先從j所指定位置起向前搜索,找到一個關鍵字小於pivot的記錄時將該記錄向前移到i指示的位置,然後從i所指示位置起向後搜索,找到第一個關鍵字大於pivot的記錄時將該記錄向後移動j所指位置,重複該過程直至i與j相等爲止。

快速排序算法的時間複雜度爲O(nlogn),在所有算法複雜度爲此數量級的排序方法中,快速排序被認爲平均性最好的一種,但是若初始記錄序列按關鍵字有序或基本有序時,即每次劃分都是將序列劃分爲某一半的長度爲0的情況下,此時快速排序的性能退化爲時間複雜度是O(n^2),快速排序是不穩定的排序方法。

3.6.5堆排序

堆排序的基本思想是:對一組待排序的關鍵字,首先按堆的定義排成一個序列(即建立初始堆),從而可以輸出堆頂的最大關鍵字(對於大根堆而言),然後將剩餘的關鍵字再調整成新推,變得到次大的關鍵字,如此反覆,直到所有關鍵字排成有序序列爲止。

對於記錄較少的文件來說,堆排序的優越性並不明顯,但對於大量的記錄來說,堆排序是很有效的,堆排序的整個算法時間是由建立初始化堆和不斷調整堆這兩部分時間構成的。可以證明,堆排序的時間複雜度爲O(nlogn),此外,堆排序只需要記錄大小的輔助空間。

3.6.6歸併排序

將兩個或兩個以上的有序文件合併成一個新的有序文件。如此反覆,直到合併是成度是1的子序列。

時間複雜度爲O(nlogn),空間複雜度爲O(n)

3.6.7基數排序

基數排序的時間複雜度爲O(d(n+rd)),空間複雜度爲O(rd),r爲基數,d是關鍵字的位數,這裏d取所有關鍵字中的最大值。

3.6.8內部排序方法總結

3.6.9外部排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章