基數排序是通過「分配」和「收集」過程來實現排序
(1)假設有欲排資料序列如下所示:
73 22 93 43 55 14 28 65 39 81
首先根據個位數的數值,在遍歷資料時將它們各自分配到編號0至9的桶(個位數值與桶號一一對應)中。
分配結果(邏輯想象)如下圖所示:
分配結束後。接下來將所有桶中所盛資料按照桶號由小到大(桶中由頂至底)依次重新收集串起來,得到如下仍然無序的資料序列:
81 22 73 93 43 14 55 65 28 39
接著,再進行一次分配,這次根據十位數值來分配(原理同上),分配結果(邏輯想象)如下圖所示:
分配結束後。接下來再將所有桶中所盛的資料(原理同上)依次重新收集串接起來,得到如下的資料序列:
14 22 28 39 43 55 65 73 81 93
觀察可以看到,此時原無序資料序列已經排序完畢。如果排序的資料序列有三位數以上的資料,則重複進行以上的動作直至最高位數為止。
** (c語言實現)
1#ifndef __singly_linked_list_h__
2#define __singly_linked_list_h__
34 typedef int
elementtype;
5struct
node;
6 typedef struct node*ptrtonode;
7typedef ptrtonode list;
8typedef ptrtonode position;910
struct
node11;
15void createlist(list*);
16void
deletelist(list);
17int
isempty(list);
18int
islast(position, list);
19position header(list);
20position first(list);
21position advance(position);
22position find(elementtype, list);
23elementtype getat(position);
24void
makeempty(list);
25void
delete(elementtype, list);
26void
insert(elementtype, position, list);
27void
insertfront(elementtype, list);
28void
insertback(elementtype, list);
2930
#endif
31void createlist(list*l)
3237
38void
deletelist(list l)
3943
44int
isempty(list l)
4548
49int
islast(position p, list l)
5053
54position header(list l)
5558
59position first(list l)
6063
64position advance(position p)
6568
69position find(elementtype x, list l)
7076
return
p;77}78
79elementtype getat(position p)
8083
84void
makeempty(list l)
8595 l->next =null;96}
9798
void
delete(elementtype x, list l)
99106
if(!islast(p, l))
107116
}117
118void
insert(elementtype x, position p, list l)
119126
127void
insertfront(elementtype x, list l)
128137
138void
insertback(elementtype x, list l)
139
1 #include 2 #include 3 #include "參考1參考2singlylinkedlist.h"4
5#define n 10 //
排序的數個數
6#define b 10 //
桶數,即基數
7#define p 3 //位數8
9void radixsort(int
arr);
10int getdigit(int x, int
y);11
void printarray(int arr, int
size);
1213
intmain()
14; //
10, 3
18//
int arr[n] = ;
19//
int arr[n] = ;
//13, 2
2021 printf("
before sort: ");
22printarray(arr, n);
2324
radixsort(arr);
2526 printf("
after sort: ");
27printarray(arr, n);
2829 system("
pause");
30return0;
31}3233
void radixsort(int
arr)
3452 k = 0;53
//將每趟排序後的結果存回arr
54for(j=0; jj)
5562}63
}6465for(i=0; ii)
66deletelist(bucket[i]);67}
6869
70//
取整數x的倒數第y位數字,y從0開始
71int getdigit(int x, int
y)72
7879
80void printarray(int arr, int
size)
8187 printf("\n"
);88 }
單鏈表實現基數排序
1 2 單鏈表實現基數排序3 45 介面標頭檔案 6 typedef int elementtype 78 ifndef list h 9 define list h 10 include 11 12struct node 13 typedef struct node ptrtonode 14typ...
基數排序單鏈表實現 C語言
標頭檔案 基數排序,單鏈表實現 ifndef radix sort h define radix sort h include define flowover 1 define list empty 2 struct radixsort typedef struct radixsort list t...
c 實現基數排序
以下介紹內容 百科 基數排序的方式可以採用lsd least significant digital 或msd most significant digital lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。以lsd為例,假設原來有一串數值如下所示 73,22,93,43,...