基數排序 MSD(桶排序)

2021-08-22 13:29:23 字數 2182 閱讀 3519

【基數排序】(radixsort)則是屬於「分配式排序」(distributionsort),

基數排序法

又稱「桶子法」(bucketsort)或binsort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其

時間複雜度

為o(nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的比較性排序法,同時基數排序分最高位優先"(msd)法和最低位優先"(lsd)法。

下面我們要講的是msd;(msd比lsd更加實用)

簡略概述:基數排序是通過「分配」和「收集」過程來實現排序。而這個思想該如何理解呢?請看以下例子。

(1)將陣列:

12  14  54  5  6  3  9  8  47  89排序

首先根據

最高位十位在遍歷資料時將它們各自分配到編號0至9的桶(個位數值與桶號一一對應)中。

分配結果(邏輯想象)如下圖所示:

0    5 6 3 9 8

1    12 14  

2         

3        

4    47    

5    54    

6    

7        

8    89    

9        

分配結束後。接下來將所有桶中所盛資料按照桶號由小到大(桶中由頂至底)依次重新收集串起來,得到如下仍然無序的資料序列:

5 6 3 9 8 12 14 47 54 89

然後再將每個桶分0-9號小桶,因為1-9號桶最多只有1個數,所以不再列出

0號桶分配結果(邏輯想象)如下圖所示:

0        

1        

2         

3     3    

4         

5     5    

6     6

7        

8     8    

9     9    

分配結束後。接下來將所有桶中所盛資料按照桶號由小到大(桶中由頂至底)依次重新收集串起來,得到如下仍然無序的資料序列:

3 5 6 8 9 12 14 47 54 89

(2)我們把撲克牌的排序看成由花色和面值兩個資料項組成的主關鍵字排序。

要求如下:

花色順序:梅花《方塊《紅心《黑桃

面值順序:2<3<4<...<10

那麼,若要將一副撲克牌排成下列次序:

梅花2,...,梅花a,方塊2,...,方塊a,紅心2,...,紅心a,黑桃2,...,黑桃a。

<1>先按花色分成四堆,把各堆收集起來;然後對每堆按面值由小到大排列,再按花色從小到大按堆收疊起來。----稱為"最高位優先"(msd)法。

(1)msd法實現

最高位優先法通常是乙個遞迴的過程:

<1>先根據最高位關鍵碼k1排序,得到若干物件組,物件組中每個物件都有相同關鍵碼k1。

<2>再分別對每組中物件根據關鍵碼k2進行排序,按k2值的不同,再分成若干個更小的子組,每個子組中的物件具有相同的k1和k2值。

<3>依此重複,直到對關鍵碼kd完成排序為止。

<4> 最後,把所有子組中的物件依次連線起來,就得到乙個有序的物件序列。

#include#include#include#include#includeusing namespace std;

const int maxn=1e6+7;

int arr[maxn]=;

int getdigit(int x,int d); 因為待排資料最大資料位數

return ((x/a[d])%10);

}void msdradix_sort(int begin,int end,int d)

//求出桶的邊界索引,count[i]值為第i個桶的右邊界索引+1

for(i=1;i=begin;--i)

//注意:此時count[i]為第i個桶左邊界

//從各個桶中收集資料

for(i = begin, j = 0;i <= end; ++i, ++j)

//釋放儲存空間

free(bucket);

//對每個桶再次排序

for(i=0;i1) }}

int main()

基數排序(MSD)

include include include include include using namespace std intgetnum int tmp 獲取乙個數的位數 return count int getmax int a,int size 獲取數的最大位數 return maxd voi...

基數排序(桶排序)

1。什麼是基數排序 radix sort 基數排序 屬於分配式排序 distribution sort 又稱 桶排序 bucket sort 它是通過鍵值的各個位的值,將要排序的元素分配至某些 桶 中,達到排序的作用。2.它和歸併一樣,屬於穩定型演算法。public void radixsort i...

基數排序(桶排序)

思想 先把這組資料的個位排有序,再把十位排有序,再排百位 千位 include include include include void showarr int arr,int len printf n int getmaxnumfin int arr,int len 找陣列中最大數,並求出最大數的...