C 經典演算法題 基數排序法

2021-10-02 06:24:24 字數 1834 閱讀 9210

在之前所介紹過的排序方法,都是屬於「比較性」的排序法,也就是每次排序時 ,都是比較整個鍵值的大小以進行排序。

這邊所要介紹的「基數排序法」(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 基數排序的基本思想是將元素的每一位都拿出來進行比較,比較的順序是從低位到高位。第一次比較之後,再將比較過的資料取出下一位進行比較 注意 比較的是某一位 或...