排序過程無須比較關鍵字,而是經過"分配"和"收集"過程來實現排序.它們的時間複雜度可達到線性階:O(n)。算法
箱排序也稱桶排序(Bucket Sort),其基本思想是:設置若干個箱子,依次掃描待排序的記錄R[0],R[1],…,R[n-1],把關鍵字等於k的記錄全都裝入到第k個箱子裏(分配),而後按序號依次將各非空的箱子首尾鏈接起來(收集)。
spa
【例】要將一副混洗的52張撲克牌按點數A<2<…<J<Q<K排序,需設置13個"箱子",排序時依次將每張牌按點數放入相應的箱子裏,而後依次將這些箱子首尾相接,就獲得了按點數遞增序排列的一副牌。設計
若R[0..n-1]中關鍵字的取值範圍是0到m-1的整數,則必須設置m個箱子。所以箱排序要求關鍵字的類型是有限類型,不然可能要無限個箱子。指針
通常狀況下每一個箱子中存放多少個關鍵字相同的記錄是沒法預料的,故箱子的類型應設計成鏈表爲宜。orm
每一個箱子設爲一個鏈隊列。當一記錄裝入某箱子時,應作人隊操做將其插入該箱子尾部;而收集過程則是對箱子作出隊操做,依次將出隊的記錄放到輸出序列中。排序
若輸入的待排序記錄是以鏈表形式給出時,出隊操做可簡化爲是將整個箱子鏈表連接到輸出鏈表的尾部。這隻須要修改輸出鏈表的尾結點中的指針域,令其指向箱子鏈表的頭,而後修改輸出鏈表的尾指針,令其指向箱子鏈表的尾便可。隊列
分配過程的時間是O(n);收集過程的時間爲O(m) (採用鏈表來存儲輸入的待排序記錄)或O(m+n)。所以,箱排序的時間爲O(m+n)。若箱子個數m的數量級爲O(n),則箱排序的時間是線性的,即O(n)。it
注意:方法
箱排序實用價值不大,僅適用於做爲基數排序(下節介紹)的一箇中間步驟。鏈表