用C語言實現簡單的基數排序

2021-10-02 06:24:23 字數 2108 閱讀 7679

八大排序演算法有:氣泡排序、插入排序、選擇排序、快速排序、希爾排序、堆排序、歸併排序、基數排序。前面七種網上都有很多例子,但是最後一種基數排序卻很少看到,所以我總結了一下,並且自己寫了乙個簡單的實現。

基數排序是一種分配排序,其基本思想是:排序過程無須比較關鍵字,而是通過「分配」和「收集」過程來實現排序。它們的時間複雜度可達到線性o(n)。基數排序所做的事情,是對n位分別進行排序。從直覺上來看,人們可能會覺得應該首先按最高有效位進行排序,不過這點與我們的直覺相反,基數排序首先對最低有效位數字進行排序。如果我們每次比較r bits,則需要進行b/r趟,每趟進行計數排序需要o(n+2^r),則總的時間複雜度為o(b/r(n+2^r))。

理論上來說,基數排序的速度是以上幾種排序方法中最快的,可以達到o(n),而其它的排序演算法最快也只有o(n*logn)。但是,基數排序需要占用額外的空間,而且只支援整數進行排序。

基數排序的演示可以看這裡:基數排序

實現**如下:

#include

#include

/* 獲取輸入數字的索引值,dec指定數字的位數,3代表百位數,order指定需要獲取哪一位的索引,1代表個位,2代表十位,3代表百位 */

intget_index

(int num,

int dec,

int order)

/* 獲得對應位數的整數 */

n =1;

for(i=

0; i1; i++

) n *=10

;/* 獲取index */

index = num / n;

return index;

}/* 進行基數排序 */

void

radix_sort

(int array,

int len,

int dec,

int order)

for(i=

1; i<

10; i++

) num[i]

+= num[i-1]

;/* 調整索引陣列 */

for(i=len-

1; i>=

0; i--

)for

(i=0

; i) array[i]

= tmp[i]

;/* 從臨時陣列複製到原陣列 */

printf

("the %d time\n"

, order)

;for

(i=0

; i<

30; i++

)printf

("%d "

, array[i]);

printf

("\n");

/* 繼續按高一位的數字大小進行排序 */

radix_sort

(array, len, dec, order+1)

;return;}

intmain

(int argc,

char

*ar**)

;int len =30;

/* 測試資料個數 */

int dec =3;

/* 資料位數,3代表3位數 */

int order =1;

/* 排序的位數,1代表個位、2代表十位、3代表百位 */

printf

("before\n");

for(i=

0; i<

30; i++

)printf

("%d "

, array[i]);

printf

("\n");

/* 排序函式,從個位開始 */

radix_sort

(array, len, dec, order)

;printf

("final\n");

for(i=

0; i<

30; i++

)printf

("%d "

, array[i]);

printf

("\n");

return0;

}

排序 8 之基數排序的C語言實現

基數排序 radix sorting 是一種借助多關鍵字排序的思想對單邏輯關鍵字進行關係的方法。基數排序不需要進行記錄關鍵字間的比較。主要分為兩個過程 1 分配,先從個位開始,根據位值 0 9 分別放到0 9號桶中 比如53,個位為3,則放入3號桶中 2 收集,再將放置在0 9號桶中的資料按順序放到...

C語言實現基數排序 基於鏈佇列實現

專案完整 執行效果圖 定義鏈結構 typedef struct linknode linknode 定義鏈佇列 typedef struct linkqueue 初始化帶頭結點的鏈式佇列 void initqueue linkqueue q 初始化帶頭結點的鏈式佇列 void initqueue l...

基數排序的簡單實現

已經學習了簡單的幾種排序,在研究字尾陣列的時候,發現裡面要用到基數排序,就研究了一下。總共花了三個小時左右吧,實現了一種簡單的 先總結一下思路吧!基數排序其實非常簡單。解法 基數排序的方式可以採用lsd least sgnificant digital 或msd most sgnificant di...