演算法 8 基數排序

2021-07-25 01:29:46 字數 1782 閱讀 6259

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數字的前幾個零的整數 對於最低有效位 最右邊 到最...