資料結構基礎 15 基數排序

2022-04-29 19:24:10 字數 2199 閱讀 1910

基數排序是一種借助「多關鍵字排序」的思想來實現「單關鍵字排序」的內部排序演算法。

實現多關鍵字排序通常有兩種作法:

最低位優先法(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

為例):

//尋找陣列中最大數字的位數

template unsigned int maxbits(type *begin, type *end)

}return bits;

}

/**說明:

begin:陣列起始

end:陣列結尾

radix:基數

*/#define debug

template void radixsort(type *begin, type *end, int radix)

//收集...

type *current = begin;

//對radix個鍊錶中的元素進行收集

for (int i = 0; i < radix; ++i)

}#ifdef debug

//列印排序的中間結果

for (current = begin; current != end; ++ current)

cout << endl;

#endif // debug

}}template void radixsort(type *array, int arraysize, int radix)

時間複雜度分析:設待排序列為n

個記錄,

d個關鍵碼,關鍵碼的取值範圍為

radix

,則進行鏈式基數排序的時間複雜度為

o(d(n+radix))

,其中,一趟分配時間複雜度為

o(n)

,一趟收集時間複雜度為

o(radix)

,共進行

d趟分配和收集

.附-

測試**

:

int main()

for (int i = 0; i < 10; ++i)

cout << endl;

radixsort(array, 10, 10);

for (int i = 0; i < 10; ++i)

cout << endl;

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,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作...