基數排序的簡單實現

2021-09-03 08:57:59 字數 1862 閱讀 6164

已經學習了簡單的幾種排序,在研究字尾陣列的時候,發現裡面要用到基數排序,就研究了一下。總共花了三個小時左右吧,實現了一種簡單的**。

先總結一下思路吧!

基數排序其實非常簡單。

解法 基數排序的方式可以採用lsd(least sgnificant digital)或msd(most sgnificant digital),lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。 

以lsd為例,假設原來有一串數值如下所示: 

73, 22, 93, 43, 55, 14, 28, 65, 39, 81 

首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中: 

0 1 81 

2 22 

3 73 93 43 

4 14 

5 55 65 

6 7 

8 28 

9 39 

接下來將這些桶子中的數值重新串接起來,成為以下的數列: 

81, 22, 73, 93, 43, 14, 55, 65, 28, 39 

接著再進行一次分配,這次是根據十位數來分配: 

0 1 14 

2 22 28 

3 39 

4 43 

5 55 

6 65 

7 73 

8 81 

9 93 

接下來將這些桶子中的數值重新串接起來,成為以下的數列: 

14, 22, 28, 39, 43, 55, 65, 73, 81, 93 

這時候整個數列已經排序完畢;如果排序的物件有三位數以上,則持續進行以上的動作直至最高位數為止。 

lsd的基數排序適用於位數小的數列,如果位數多的話,使用msd的效率會比較好,msd的方式恰與lsd相反,是由高位數為基底開始進行分配,其他的演算方式則都相同。 

(注:以上紅色文字選自:

但是作者上面的**實現我個人覺得太麻煩了,就自己寫一遍。還是對指標不熟悉啊!指標的問題糾結了一下下。

#include

#include

typedef

struct bucket 

}bucket;//這個桶:實質上是乙個鍊錶陣列

bucket b[10]; 

void basesort(int a[10],int m) 

chu=yu/10; 

//第二步:把a[i]裡的數 裝進 桶裡面去

int pos; 

bucket *p; 

for(i=0;i<10;i++)//這裡對鍊錶採用加到尾部的方法

bi->val=a[i]; 

p->next=bi; 

} //第三步:把桶裡面的數依次放回到陣列中去,並把桶清空

i=0,j=0; 

p=b[0].next;//鍊錶的頭結點為空

bucket *f;//用來釋放空間

while(i<10&&j<10) 

b[j].next=null;//當前桶已經查詢完畢,清空,為下次儲存作準備

p=b[++j].next;//查詢下乙個桶

} } 

int main(); 

int k=5;//k表示陣列中最大數的位數,這裡的5表示10000的位數

//排序:從右到左,按lsd的方式(做菜:烹飪)

for(int i=0;ibasesort(a,i); 

} //output(做菜:出菜)

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

printf("%d ",a[i]); 

return 0; 

} 好了,問題來了:如果資料是負數就能不能直接這樣做呢?答案當然是不行的,但是用這種思想依然是可以解決滴!

基數排序 簡單理解

基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。1 遍歷序列找出最大的數 為的是確定最大的數是幾位數 2 開闢乙個與...

c 實現基數排序

以下介紹內容 百科 基數排序的方式可以採用lsd least significant digital 或msd most significant digital lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。以lsd為例,假設原來有一串數值如下所示 73,22,93,43,...

基數排序 佇列實現

基數排序是一種不需要比較就能實現排序的演算法思維,主要步驟為分配和收集的過程,重複這個過程於最大數的位數後,排序結束。以下是完全以佇列模擬桶的分配收集過程。標頭檔案 單鏈表部分 typedef int elemtype typedef struct lnode lnode,linklist int ...