在之前所介紹過的排序方法,都是屬於「比較性」的排序法,也就是每次排序時 ,都是比較整個鍵值的大小以進行排序。
這邊所要介紹的「基數排序法」(radix sort)則是屬於「分配式排序」(distribution sort), 基數排序法又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog®m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的比較性排序法。
基數排序的方式可以採用lsd(least sgnificant digital)或msd(most sgnificant digital),
lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。以lsd為例,假設原來有一串數值如下所示:
73,22
,93,43
,55,14
,28,65
,39,81
首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:
012
3456
78981
6539
4314
5528
9322
73
接下來將這些桶子中的數值重新串接起來,成為以下的數列:81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接著再進行一次分配,這次是根據十位數來分配:
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
14,22
,28,39
,43,55
,65,73
,81,93
這時候整個數列已經排序完畢;如果排序的物件有三位數以上,則持續進行以上的動作直至最高位數為止。
lsd的基數排序適用於位數小的數列,如果位數多的話,使用msd的效率會比較好,msd的方式恰與lsd相反,是由高位數為基底開始進行分配,其他的演 算方式則都相同。
#include
#include
intmain
(void);
int temp[10]
[10]=
;int order[10]
=;int i, j, k, n, lsd; k =0;
n =1;
printf
("\n排序前: ");
for(i =
0; i <
10; i++
)printf
("%d "
, data[i]);
putchar
('\n');
while
(n <=10)
printf
("\n重新排列: ");
for(i =
0; i <
10; i++
) order[i]=0
;}n *=10
; k =0;
}putchar
('\n');
printf
("\n排序後: ");
for(i =
0; i <
10; i++
)printf
("%d "
, data[i]);
return0;
}
經典演算法 基數排序
概述 基數排序是一種高效的線性排序演算法。其方法是將資料按位分開,並從資料的最低有效位到最高有效位進行比較,依次排序,從而得到有序資料集合。例子 用基數排序對十進位制資料進行排序。在對個位數排序之後 在對十位數排序之後 有一點非常重要,在對每一位數值進行排序時其排序過程必須是穩定的。程式 inclu...
基數排序 經典
基數排序 英語 radix sort 是一種非比較型 整數排序演算法 其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字串 比如名字或日期 和特定格式的浮點數,所以基數排序也不是只能使用於整數。它是這樣實現的 將所有待比較數值 正整數 統一為同樣的數字長度,數字較短的...
基數排序法
摘要 1 基數排序法是建立在桶式排序的基礎之上,而桶式排序的缺點就是不方便計算數值很大的陣列 元素個數不一定多 利用基數排序可以解決這個問題 2 基數排序的基本思想是將元素的每一位都拿出來進行比較,比較的順序是從低位到高位。第一次比較之後,再將比較過的資料取出下一位進行比較 注意 比較的是某一位 或...