第七章 排序

2021-09-24 12:32:50 字數 4747 閱讀 2163

排序就是將原本無序的序列重新排列成有序的序列

如果待排序表中有兩個元素ri、rj,其對應的關鍵字keyi=keyj,且在排序前ri在rj前面,如果使用某一排序演算法排序後,ri仍然在rj的前面,則稱這個排序演算法是穩定的,否則稱排序演算法是不穩定的。

首先以乙個元素為有序的序列,然後將後面的元素依次插入到有序的序列中合適的位置直到所有元素都插入有序序列。

空間複雜度:在下標為0處儲存哨兵,是常數個輔助空間大小,所以空間複雜度為o(1)

時間複雜度:最壞情況下,整個序列都是逆序;最好情況下,整個序列都是順序

2.1 插入類排序的定義
插入類排序就是在乙個有序的序列中,插入乙個新的關鍵字,直到所有的關鍵字都插入形成乙個有序的序列

2.2 折半插入排序
將比較和移動這兩個操作分離出來,也就是先利用折半查詢找到插入的位置,然後一次性移動元素,再插入該元素。

時間複雜度o(nlog2n)

時間複雜度還是o(n2)

2.3 希爾排序(縮小增量排序)
基本思想:希爾排序本質上還是插入排序,只不過是把待排序序列分成幾個子串行(按照一定增量(一組元素中下標的差值)),再分別對這幾個子串行進行直接插入排序

希爾排序的優勢:希爾排序的每一輪都會使整個序列變得越來越有序,最後一輪當增量為1的時候,整個序列幾乎都是有序的,所以進行直接插入排序會提高排序的效率。

時間複雜度:希爾排序的時間複雜度約為o(n1.3),在最壞情況下希爾排序的時間複雜度為o(n2)空間複雜度:希爾排序的空間複雜度為o(1)3.1 交換類排序的定義

根據序列中兩個元素關鍵字比較結果來交換它們在序列中的位置

3.2 氣泡排序
假設待排序表長為n,從後往前(或從前往後)兩兩比較相鄰元素的值,若為逆序(即a[i-1]>a[i]),則交換它們,直到序列比較完。我們稱它為一趟冒泡,結果將最小的元素交換到待排序列的第乙個位置。下一趟冒泡時,前一趟確定的最小元素不再參與比較,待排序列減少乙個元素,每趟冒泡的結果把序列中的最小元素放到了序列的最終位置,……,這樣最多做n-1趟冒泡就能把所有元素排好序。

空間複雜度交換時開闢了儲存空間來儲存中間變數,所以空間複雜度為o(1)

時間複雜度

最壞情況下,初始序列就是逆序的,那麼對於外層每一次迴圈,內層迴圈始終成立,外層迴圈i從0執行到n-1,第i次內層迴圈執行次數為n-1-i,所以一共執行∑i=

0n−1

n−1−

i\sum_^n - 1 - \mathbb

i=0∑n−

1​n−

1−i=n(n-1)/2 所以最壞情況下時間複雜度為o(n2)。

最好情況下,初始序列就是順序的,內層迴圈if條件始終不成立,所以內層執行n-1次後結束,所以時間複雜度為o(n)

3.3 快速排序

快速排序是一種基於分治法的排序方法。

每一趟快排選擇序列中任乙個元素作為樞軸(pivot)(通常選第乙個元素),將序列中比樞軸小的元素都移到樞軸前邊,比樞軸大的元素都移到樞軸後邊。

時間複雜度

最好情況下時間複雜度為o(nlogn) ,待排序序列越無序,演算法效率越高。

最壞情況下時間複雜度為o(n2),待排序序列越有序,演算法效率越低。

空間複雜度

由於快速排序是遞迴的,需要借助乙個遞迴工作棧來儲存每一層遞迴呼叫的必要資訊,其容量應與遞迴呼叫的最大深度一致。

最好情況下為 ⌈log2(n+1)⌉(每次partition都很均勻)遞迴樹的深度o(logn)

最壞情況下,因為要進行n-1次遞迴呼叫,所以棧的深度為o(n);

4.1 選擇類排序的定義
每一趟在後面n-i+1(i=1,2,3,······,n-1)個待排序元素中選取關鍵字最小的元素,直到第n-1趟做完,待排序元素只剩下1個,就不用再選了。

簡單選擇排序

依次從後面序列中選擇當前最小的元素作為第i個元素,如果這個值更小,則更新min值為這個更小的元素所在下標;如果第i個元素不是剩下元素最小的,則和最小的進行交換;最後乙個元素不需要排序。

空間複雜度是o(1)

時間複雜度為o(n2)

4.2 堆排序
堆是一棵完全二叉樹,而且滿足任何乙個非葉結點的值都不大於(或不小於)其左右孩子結點的值。

如果是每個結點的值都不小於它的左右孩子結點的值,則稱為大頂堆。

如果是每個結點的值都不大於它的左右孩子結點的值,則稱為小頂堆。

堆排序的思想

每次將無序序列調節成乙個堆,然後從堆中選擇堆頂元素的值,這個值加入有序序列,無序序列減少乙個,再反覆調節無序序列,直到所有關鍵字都加入到有序序列。

調整方法:二叉樹由下至上由右至左(陣列的下標由大到小),檢查每個結點是否滿足大頂堆的要求,如果不滿足進行調整。

二叉樹性質5:

對完全二叉樹按從上到下、從左到右的順序依次編號1,2,…,n,則有以下關係:

當i>1時,結點i的雙親結點編號為⌊i/2⌋,即當i為偶數時,其雙親結點的編號為i/2,它是雙親結點的左孩子;當i為奇數時,其雙親結點的編號為(i-1)/2,它是雙親結點的右孩子。

當2i≤n時,結點i的左孩子編號為2i,否則無左孩子。

當2i+1≤n時,結點i的右孩子編號為2i+1,否則無右孩子。

空間複雜度

堆排序只需要在交換結點的時候需要額外儲存空間來輔佐,所以空間複雜度為o(1)

時間複雜度

堆排序的總時間可以分為①建堆部分的時間複雜度o(n)+②n-1次向下調整堆的時間複雜度為o(nlog2n)=o(nlog2n)

假定待排序表含有n個記錄,則可以看成是n個有序的子表,每個子表長度為1,然後兩兩歸併,得到

⌈n/2⌉個長度為2或1的有序表;再兩兩歸併,……如此重複,直到合併成乙個長度為n的有序表為止,這種排序方法稱為2-路歸併排序。

時間複雜度:o(nlog2n)

空間複雜度:o(n)

基數排序(也叫桶排序)是一種很特別的排序方法,它不是基於比較進行排序的,而是採用多關鍵字排序思想(即基於關鍵字各位的大小進行排序的),借助「分配」和「收集」兩種操作對單邏輯關鍵字進行排序。基數排序又分為最高位優先(msd)排序和最低位優先(lsd)排序。

桶實際是乙個佇列,先進先出(從桶的上面進,下面出)

空間複雜度:o®

時間複雜度:o(d(n+r))

需要將待排序的記錄儲存在外存上,**排序時再把資料一部分一部分的調入記憶體進行排序。**在排序過程中需要多次進行記憶體和外存之間的交換,對外存檔案中的記錄進行排序後的結果仍然被放到原有檔案中。這種排序的方法就叫做外部排序。

7.1 置換-選擇排序

可以對無序的序列得到初始的歸併段。

7.2 最佳歸併樹

如果把各個歸併段的長度記做是某個結點的權值,那麼最佳歸併樹就是一棵n路的哈夫曼樹

最佳的歸併策略可以通過最佳歸併樹來找到,但是對於多路歸併來說,每次歸併如何得到最值的關鍵字

7.3 敗者樹

敗者樹可以看成是一棵完全二叉樹:

這棵樹的葉子結點儲存的各個歸併段當前參加比較的記錄,內部結點儲存的則是左右子樹當中的失敗者。

勝利者則一直繼續向上比較直到根結點。

由於每次歸併我們都是希望找到各個歸併段中最小的關鍵字,所以勝利者應該是左右子樹中關鍵字較小的。

第七章 快速排序

快速排序的描述 與歸併排序一樣,快速排序也使用了分治思想。具體步驟 分解 陣列 a p.r 被劃分為兩個子陣列 可能為空 a p.q 1 和 a q 1.r 使得 a p.q 1 中的每乙個元素都小於等於 a q 而 a q 小於等於 a q 1.r 中的每個元素。解決 通過遞迴呼叫快速排序,對子陣...

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...

演算法導論 第七章 排序

什麼是穩定排序?n個記錄的序列為 r1,r2,r3 rn 其相應的鍵值序列為 k1,k2,k3 kn 假設ki kj,若在排序前的序列中ri在rj之前,即 i注意 穩定性是排序方法本身的特性,與資料無關,換句話說,一種排序方法如果是穩定的,則對所有的資料序列都是穩定的,反過來,如果在一組資料上出現不...