分配排序的基本思想:排序過程無須比較關鍵字,而是通過"分配"和"收集"過程來實現排序.它們的時間複雜度可達到線性階:o(n)。
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))。
資料結構 分配排序
基於分配和收集 先將資料分配到不同的桶中 再將桶中的資料收集到一起 桶式排序 單關鍵字排序 鏈式基數排序 多關鍵字排序 排序過程無須比較關鍵字,而是通過 分配 和 收集 過程來實現排序 它們的時間複雜度可達到線性階 o n 假設待排序的記錄的值在0 m 1之間 設定m個桶,依次掃瞄待排序的記錄,r ...
資料結構 排序演算法
include include define maxitem 100 typedef char keytype 5 typedef int elemtype typedef struct rec elemnode maxitem 氣泡排序演算法 void bubblesort elemnode r,...
資料結構 排序演算法
排序演算法分為內部排序和外部排序兩大類。內部排序 在計算機記憶體中完成的排序演算法 外部排序 不能再記憶體中文完成,必須在磁碟或者磁帶上完成的排序演算法 內部排序是研究的重點問題,通常我們講的八大排序演算法也主要是講的內部排序演算法。排序演算法的穩定性和時間空間複雜度 本文重點介紹以下幾種排序演算法...