基數排序,也叫關鍵碼排序


一、實現思想

  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:我這里顯示了行號,你應該會列選擇,然后刪除吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM