一、實現思想
1、關鍵碼排序,實際上是給數據貼上關鍵碼,然后對關鍵碼進行排序
2、關鍵碼就是一些數字。比如關鍵碼是兩位數時,我可以先對個位數進行排序,然后再對十位數進行排序,最后得到的就是有序的序列。
3、這里補充一點數據結構安排上的細節,因為這樣的數據結構安排,用起來確實有點妙。
待排序的序列是用鏈表來存儲,在按某個位數進行排序時,實際上是按照該位數大小,放到一個可以拓展的數組(沒錯,就是指針數組),最后再將數組上的小鏈表連接起來
二、實現圖
按位數分配的時候,嚴謹一點,其實是有兩個指針數組,一個指向序號的第一個節點,一個指向序號的最后一個節點(當然了,序號只有一個節點時,指向的是同一個節點)
為什么要兩個這樣的指針數組,因為我們需要把對應序號上的許多個小鏈表連接起來。指向鏈表尾部,方便和下一個鏈表的首部,連接起來。
三、實現代碼
1 #include <stdio.h> 2 typedef struct Node 3 { 4 char name; 5 int flag; 6 Node *next; 7 } Node, *pNode; 8 9 pNode RadixSort(pNode first, int d) 10 { 11 pNode front[10], rear[10], tail; 12 int k; //用來記錄關鍵碼的個位/十位/百位 等等 13 int base = 1; //用來控制,k 14 for (int i = 0; i < d; i++) //進行d趟基數排序 15 { 16 for (int j = 0; j < 10; j++) 17 { 18 front[j] = NULL; 19 rear[j] = NULL; 20 } 21 22 while (first != NULL) //遍歷鏈表,將節點分配給鏈表數組 23 { 24 k = (first->flag / base) % base; 25 if (front[k] == NULL) 26 { 27 front[k] = first; 28 rear[k] = first; 29 } 30 else 31 rear[k] = rear[k]->next = first; 32 first = first->next; 33 } 34 for (int j = 0; j < 10; j++) //通過鏈表數組,將節點重新組合成鏈表 35 { 36 if (front[j] == NULL) 37 continue; 38 if (first == NULL) //這對if else用得太好了,tail->next是一定要有的,但是第一次又不需要 39 first = front[j]; 40 else 41 tail->next = front[j]; 42 tail = rear[j]; 43 } 44 tail->next = NULL; //為單鏈表加上一個尾標志 45 base = base * 10; 46 } 47 return first; 48 } 49 int main(void) 50 { 51 int flag[] = {61, 98, 12, 15, 20, 24, 31, 23, 35}; 52 char name[] = {'H', 'I', 'A', 'B', 'C', 'E', 'f', 'D', 'G'}; 53 pNode mypNode = NULL; 54 pNode front = NULL; 55 pNode back = NULL; 56 //構造一個鏈表,這不是重點,重點在RadixSort函數上 57 for (int i = 0; i < 9; i++) 58 { 59 pNode temp = new Node; //這里必須要new一個節點出來 60 temp->name = name[i]; 61 temp->flag = flag[i]; 62 temp->next = NULL; 63 if (0 == i) 64 { 65 mypNode = temp; 66 front = temp; 67 } 68 else 69 { 70 back = temp; 71 front->next = back; 72 front = front->next; 73 } 74 } 75 front = NULL; 76 back = NULL; 77 front = mypNode; 78 while (front != NULL) 79 { 80 printf("%c %d ", front->name, front->flag); 81 front = front->next; 82 } 83 printf("\n"); 84 mypNode = RadixSort(mypNode, 2); 85 front = mypNode; 86 while (front != NULL) 87 { 88 printf("%c %d ", front->name, front->flag); 89 front = front->next; 90 } 91 return 0; 92 } 93 /* 94 輸出: 95 ———————————————————————————————————————————————————————————————— 96 H 61 I 98 A 12 B 15 C 20 E 24 f 31 D 23 G 35 97 A 12 B 15 C 20 E 24 D 23 f 31 G 35 H 61 I 98 98 ———————————————————————————————————————————————————————————————— 99 */
ps:我這里顯示了行號,你應該會列選擇,然后刪除吧