八大排序演算法有:氣泡排序、插入排序、選擇排序、快速排序、希爾排序、堆排序、歸併排序、基數排序。前面七種網上都有很多例子,但是最後一種基數排序卻很少看到,所以我總結了一下,並且自己寫了乙個簡單的實現。
基數排序是一種分配排序,其基本思想是:排序過程無須比較關鍵字,而是通過「分配」和「收集」過程來實現排序。它們的時間複雜度可達到線性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...