演算法 排序(10)

2021-04-24 19:21:30 字數 2202 閱讀 4847

分配排序的基本思想:排序過程無須比較關鍵字,而是通過"分配"和"收集"過程來實現排序.它們的時間複雜度可達到線性階:o(n)。

箱排序(bin sort)

1、箱排序的基本思想

箱排序也稱桶排序(bucket sort),其基本思想是:設定若干個箱子,依次掃瞄待排序的記錄r[0],r[1],…,r[n-1],把關鍵字等於k的記錄全都裝入到第k個箱子裡 (分配),然後按序號依次將各非空的箱子首尾連線起來(收集)。

【例】要將一副混洗的52張撲克牌按點數a<2<…

2、箱排序中,箱子的個數取決於關鍵字的取值範圍。

若r[0..n-1]中關鍵字的取值範圍是0到m-1的整數,則必須設定m個箱子。因此箱排序要求關鍵字的型別是有限型別,否則可能要無限個箱子。

3、箱子的型別應設計成煉表為宜

一般情況下每個箱子中存放多少個關鍵字相同的記錄是無法預料的,故箱子的型別應設計成煉表為宜。

4、為保證排序是穩定的,分配過程中裝箱及收集過程中的連線必須按先進先出原則進行。

(1) 實現方法一

每個箱子設為乙個鏈佇列。當一記錄裝入某箱子時,應做人隊操作將其插入該箱子尾部;而收集過程則是對箱子做出隊操作,依次將出隊的記錄放到輸出序列中。

(2) 實現方法二

若輸入的待排序記錄是以鍊錶形式給出時,出隊操作可簡化為是將整個箱子鍊錶鏈結到輸出鍊錶的尾部。這只需要修改輸出鍊錶的尾結點中的指標域,令其指向箱子鍊錶的頭,然後修改輸出鍊錶的尾指標,令其指向箱子鍊錶的尾即可。

5、演算法簡析

分配過程的時間是o(n);收集過程的時間為o(m) (採用鍊錶來儲存輸入的待排序記錄)或o(m+n)。因此,箱排序的時間為o(m+n)。若箱子個數m的數量級為o(n),則箱排序的時間是線性的,即o(n)。

注意:箱排序實用價值不大,僅適用於作為基數排序(下節介紹)的乙個中間步驟。

桶排序

箱排序的變種。為了區別於上述的箱排序,姑且稱它為桶排序(實際上箱排序和桶排序是同義詞)。

1、桶排序基本思想

桶排序的思想是把[0,1)劃分為n個大小相同的子區間,每一子區間是乙個桶。然後將n個記錄分配到各個桶中。因為關鍵字序列是均勻分布在[0,1)上 的,所以一般不會有很多個記錄落入同乙個桶中。由於同一桶中的記錄其關鍵字不盡相同,所以必須採用關鍵字比較的排序方法(通常用插入排序)對各個桶進行排 序,然後依次將各非空桶中的記錄連線(收集)起來即可。

注意:這種排序思想基於以下假設:假設輸入的n個關鍵字序列是隨機分布在區間[0,1)之上。若關鍵字序列的取值範圍不是該區間,只要其取值均非負,我們總能 將所有關鍵字除以某一合適的數,將關鍵字對映到該區間上。但要保證對映後的關鍵字是均勻分布在[0,1)上的。

2、桶排序演算法

偽**演算法為:

void bucketson(r)

{ //對r[0..n-1]做桶排序,其中0≤r[i].key<1(0≤i注意:

實現時需設定乙個指標向量b[0..n-1]來表示n個桶。但因為任一記錄r[i]的關鍵字滿足:0≤r[i].key<1(0≤i≤n-1), 所以必須將r[i].key對映到b的下標區間[0,n-1)上才能使r[i]裝入某個桶中,這可通過└n*(r[i].key)┘來實現。

3、桶排序示例

r[0..9]中的關鍵字為 (0.78,0.17,0.39,0.26,0.72,0.94,0.21, 0.12,0.23,0.68),用演算法bucketsort排序的過程【參見動畫演示】。

分析:這裡n=10,故b[0..9]這10個桶表示的子區間分別是[0,0.1),[0.1,0.2),…,[0.9,1)。

收集過程只要按b[0],b[1],…,b[9]的次序將各非空桶首尾鏈結起來,或將其輸出到r[0..9)中即可。

4、桶排序演算法分析

桶排序的平均時間複雜度是線性的,即o(n)。但最壞情況仍有可能是o(n2)。

箱排序只適用於關鍵字取值範圍較小的情況,否則所需箱子的數目m太多導致浪費儲存空間和計算時間。

【例】n=10,被排序的記錄關鍵字ki取值範圍是0到99之間的整數(36,5,16,98,95,47, 32,36,48)時,要用100個箱子來做一趟箱排序。(即若m=n2時,箱排序的時間o(m+n)=o(n2))。

排序演算法總結 10 桶排序

桶排序假設待排序序列的元素服從 0 1 間的均勻分布,首先將區間 0 1 劃分成m個大小相同的子區間,或稱為桶。然後將所有元素放在各自所屬的區間中。因為序列是均勻分布的,所以各個區間中個元素個數相差不大。然後對每個區間的元素排列,可以用插入排序,因為元素較少,也可用快速排序。然後遍歷每個區間,將各個...

10種排序演算法總結

排序演算法有很多,所以在特定情景中使用哪一種演算法很重要。為了選擇合適的演算法,可以按照建議的順序考慮以下標準 1 執行時間 2 儲存空間 3 程式設計 工作 對於資料量較小的情形,1 2 差別不大,主要考慮 3 而對於資料量大的,1 為首要。主要排序法有 一 冒泡 bubble 排序 相鄰交換 二...

演算法筆記 堆排序1 0

郭郭自學筆記 1 堆排序1.0 1.堆是什麼 堆其實就是乙個完全二叉樹 特點 2.堆特性的應用 對於給的一組資料,如上圖 16,14,10,8,7,9,3,2,4,1 從大到小排序。如上圖,乙個大根堆,的根節點,明顯是一組資料的最大值。3.堆排序 c 下次我絕對不寫這麼多話了,直接上 include...