基數排序是一種借助「多關鍵字排序」的思想來實現「單關鍵字排序」的內部排序演算法。
實現多關鍵字排序通常有兩種作法:
最低位優先法(lsd)
先對k[0]進行排序,並按 k(0) 的不同值將記錄序列分成若干子串行之後,分別對 k[1] 進行排序,..., k[d-1]依次類推,直至最後對最次位關鍵字排序完成為止。
最高位優先法(msd)
先對 k[d-1]進行排序,然後對 k[d-2]進行排序,依次類推,直至對最主位關鍵字 k[0] 排序完成為止。
基數排序(radix sort)是屬於「分配式排序」(distribution sort),基數排序法又稱「桶子法」(bucket sort),顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,在某些時候,基數排序法的效率高於其它的穩定性排序法。
鏈式基數排序基本步驟如下
1.將待排序記錄以陣列儲存[或者以指標相鏈,構成乙個鍊錶]
2.」分配」時,按當前」關鍵字位」所取值,將記錄分配到不同的」鍊錶/鏈佇列」(即不同的桶或堆中)中,每條鍊錶中記錄的」關鍵字位」相同;
3.」收集」時,按當前關鍵字位取值從小到大(即將這n條鍊錶(n的大小為基數的大小)按照編號, 依次將其中所有的元素取出)將各煉表中的元素取出放入到原先的陣列或鍊錶中;
4.對每個關鍵字位均重複 2) 和 3) 兩步n次。
如採用lsd對(構成乙個鍊錶或者是陣列)進行基數排序:
[第一步:按個位排]
[第二步
:按十位排]
[第三步
:按百位排]
**實現(
以lsd
為例):
[cpp]view plain
copy
//尋找陣列中最大數字的位數
template
<
typename
type>
unsigned int
maxbits(type *begin, type *end)
} return
bits;
}
[cpp]view plain
copy
/**說明:
begin:陣列起始
end:陣列結尾
radix:基數
*/#define debug
template
<
typename
type>
void
radixsort(type *begin, type *end,
intradix)
//收集...
type *current = begin;
//對radix個鍊錶中的元素進行收集
for(
inti = 0; i
} #ifdef debug
//列印排序的中間結果
for(current = begin; current != end; ++ current)
cout <
#endif // debug
} }
template
<
typename
type>
void
radixsort(type *array,
intarraysize,
intradix)
時間複雜度分析:
設待排序列為n
個記錄,
d個關鍵碼,關鍵碼的取值範圍為
radix
,則進行鏈式基數排序的時間複雜度為
o(d(n+radix))
,其中,一趟分配時間複雜度為
o(n)
,一趟收集時間複雜度為
o(radix)
,共進行
d趟分配和收集.
附-
測試**
:[cpp]view plain
copy
intmain()
for(int
i = 0; i
cout <
radixsort(array, 10, 10);
for(
inti = 0; i
cout <
return
0;
}
資料結構基礎 15 基數排序
基數排序是一種借助 多關鍵字排序 的思想來實現 單關鍵字排序 的內部排序演算法。實現多關鍵字排序通常有兩種作法 最低位優先法 lsd 先對k 0 進行排序,並按 k 0 的不同值將記錄序列分成若干子串行之後,分別對 k 1 進行排序,k d 1 依次類推,直至最後對最次位關鍵字排序完成為止。最高位優...
資料結構 基數排序原理
先看兩個例子 例1 有一組數字包含20個整數,範圍1 20,數字亂序排列,如何恢復從小到大的排列順序?15,03,07,17,11,04,19,13,06,18,16,02,09,05,12,14,08,20,10,01 且看我的方法。先把以上數字按個位數的大小從小到大排,注意,只看個位 20,01...
資料結構 基數排序(桶排序)
基數排序和計數排序都屬於 非比較排序 有關計數排序可檢視 基數排序介紹 基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作...