基數排序
基數排序(Radix Sort)是對箱排序的改進和推廣。
1、單關鍵字和多關鍵字
檔案中任一記錄R[i]的關鍵字均由d個分量
構成。
若這d個分量中每個分量都是一個獨立的關鍵字,則檔案是多關鍵字的(如撲克牌有兩個關鍵字:點數和花色);否則檔案是單關鍵字的,
(0≤j<d)只不過是關鍵字中其中的一位(如字串、十進位整數等)。
多關鍵字中的每個關鍵字的取值範圍一般不同。如撲克牌的花色取值只有4種,而點數則有13種。單關鍵字中的每位一般取值範圍相同。
2、基數
設單關鍵字的每個分量的取值範圍均是:
C0≤kj≤Crd-1(0≤j<d)
可能的取值個數rd稱為基數。
基數的選擇和關鍵字的分解因關鍵宇的類型而異:
(1) 若關鍵字是十進位整數,則按個、十等位進行分解,基數rd=10,C0=0,C9=9,d為最長整數的位元;
(2) 若關鍵字是小寫英文字串,則rd=26,Co='a',C25='z',d為字串的最大長度。
3、基數排序的基本思想
基數排序的基本思想是:從低位到高位依次對Kj(j=d-1,d-2,…,0)進行箱排序。在d趟箱排序中,所需的箱子數就是基數rd,這就是"基數排序"名稱的由來。
4、基數排序的排序過程
要排序的記錄關鍵字取值範圍是0到99之間的整數(36,5,16,98,95,47,
32,36,48)。對這些關鍵字進行基數排序的過程【參見動畫示範】。
5、基數排序的類型說明和演算法描述
要保證基數排序是正確的,就必須保證除第一趟外各趟箱排序是穩定的。相應的類型說明及演算法描述【參見教材】。
6、演算法分析
若排序檔案不是以數組R形式給出,而是以單鏈表形式給出(此時稱為鏈式的基數排序),則可通過修改出隊和人隊函數使表示箱子的鏈隊列無須分配結點空間,
而使用原鏈表的結點空間。人隊出隊操作亦無需移動記錄而僅需修改指標。雖然這樣一來節省了一定的時間和空間,但演算法要複雜得多,且時空複雜度就其數量級而
言並未得到改觀。 有關鏈式的基數排序可【閱讀參考書目[12]】。
基數排序的時間是線性(即O(n))。
基數排序所需的輔助儲存空間為O(n+rd)。
基數排序是穩定的。