1. 基數排序
1.2 **
#include
#include
#define dbmsg(fmt, args ...
) printf(
"%s:%s[%d]: "fmt"\n"
, __file__,__function__, __line__,
##args)
intdump_array
(int
*arr
,int
len)
printf(
"\n");
return 0;
}int get_position_num(
int data,
int pos)
#define bucket_num 16
#define int_bits 32 /
/int 32bits 32/4
void radix_sort(
int* arr,
intlen
)for
(num_pos=1; num_pos<
=int_bits/4; num_pos++)
//32位int最大
是0xffff ffff, 8個f,所以要排8次
printf(
"\n");
for(i=0, j=0; i
//收集 dump_array(arr,
len);}
for(i=0; i
}int main (
int argc, char *argv)
;int arr=
;int
len= sizeof(arr)
/sizeof(
int)
;dbmsg(
"array len=%d"
,len);
dump_array(arr,
len)
;radix_sort(arr,
len)
;printf(
"after merge sort\n");
dump_array(arr,
len)
;return exit_success;}
注: 為什麼需要分配一次收集一次呢?
第1次將個位數
第2次 對於同乙個bucket來說個位數小的先進入bucket,個位數大的後進入bucket,
所以對於這乙個bucket來說,十位數相同,個位數是從小到大
第3次
對於這乙個bucket來說,百位數相同,剩餘的兩位由小到大
.....
最後 對於這乙個bucket來說,最高位數相同,剩餘的位數由小到大
把bucket輸出不就是有序的數了嘛。
第一趟以
第1個f為基數進行排序
0 1 49=0x31 65=0x41 97=0x61 49=0x3123
4 4=0x4
56 38=0x26
7 55=0x3789
ab 27=0x1b
c 76=0x4c
d 13=0xd ef
第二趟以
第2個f為基數進行排序
0 4=0x4 13=0xd
1 27=0x1b
2 38=0x26
3 49=0x31 49=0x31 55=0x37 -->此時就能保證個位數有序
4 65=0x41 76=0x4c
56 97=0x61 7 8
9ab c d e
f 1.4 **打包
排序演算法8 基數排序
基數排序 基數排序的演算法思想 基數排序不同於前面的各種排序演算法,前面的排序演算法都是基於元素之間的比較好實現的,而基數排序則是利用分類進行排序的方法。演算法思想 基數排序是一種多關鍵字排序演算法。基數排序通過對所有元素根據關鍵字進行分類,然後按照關鍵字的順序將這些元素收集起來,通過這樣的方法完成...
驗證演算法(8)基數排序
include include include define maxe 20 線性表中最多元素個數 define maxr 10 基數的最大取值 define maxd 8 關鍵字位數的最大取值 typedef struct node rectype void crealink rectype p,...
基礎演算法 8 基數排序
基數排序 假設 如果要排序的專案是大範圍但小數字的整數,我們可以將計數排序 counting sort 思想與基數排序 radix sort 結合起來,以實現線性時間複雜度。在基數排序中,我們將每個專案排序為乙個 w 數字串 如果需要,我們填充小於w數字的前幾個零的整數 對於最低有效位 最右邊 到最...