基数排序

Posted Lune-Qiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基数排序相关的知识,希望对你有一定的参考价值。

基数排序:最稳定的排序。 第二个基于非比较的排序。第一个是计数排序

LSD:低位优先

MSD : 高位优先

接下来说的是LSD低位优先

思路:按位建立哈希表,从低位开始

由于每一位都有0~9的阿拉伯数字构成。所以我们可以申请固定的空间

根据个位建立哈希表,再按照顺序放回原数组

根据十位建立哈希表,再按照顺序放回原数组

根据百位建立哈希表,再按照顺序放回原数组

。。。。

需要注意的是,哈希表的添加为尾添加,且必须按照原数组顺序。

代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 typedef struct node1
 5 {
 6     int num;
 7     struct node1* pnext;
 8 }Node;
 9 
10 void RadixSort(int* arr,int len)
11 {
12     //找到最高位,决定我们要建立几次哈希表
13     int Max = arr[0];
14     for(int i = 0; i < len;i++)
15     {
16         if(Max < arr[i])
17             Max = arr[i];
18     }
19 
20     int n = 10;
21     while(Max/n)
22     {
23         n *=10;
24     }
25     Node** Radix = (Node**)malloc(sizeof(Node*)*10);
26     memset(Radix,0,sizeof(Node*)*10);
27     for(int i = 1; i < n;i*=10)
28     {
29         //建立哈希表
30         for(int j = 0; j < len;j++)
31         {
32             Node* node = (Node*)malloc(sizeof(Node));
33             node->num = arr[j];
34             node->pnext = NULL;
35             int index = arr[j]/i%10;//求得每一位上的数
36             //建立哈希表进行尾添加
37             if(Radix[index])
38              {
39                 Node* tmp = Radix[index];
40                 while(tmp->pnext != NULL)
41                 {
42                     tmp = tmp->pnext;
43                 }
44                 tmp->pnext = node;
45              }
46              else
47                 Radix[index] = node;
48         }
49         int id = 0;
50         Node* pDel;
51         //放回原数组并删除原链表的节点
52         for(int i = 0; i < 10;i++)
53         {
54             while(Radix[i])
55             {
56                 arr[id++] = Radix[i]->num;
57                 pDel = Radix[i];
58                 Radix[i] = Radix[i]->pnext;
59                 free(pDel);
60                 pDel = NULL;
61             }
62         }
63     }
64     free(Radix);
65     Radix = NULL;
66 }
67 int main()
68 {
69     int arr[] = {322,15,45,3,78,987,54,0,5,14};
70     int len = sizeof(arr)/sizeof(arr[0]);
71 
72     RadixSort(arr,len);
73     for(int i = 0; i < len;i++)
74         printf("%d ",arr[i]);
75 }

 

以上是关于基数排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-排序之基数排序(使用java代码实现)

基数排序:基数排序中的“组”是啥意思?

算法-java代码实现基数排序

改变基数排序基础?

LSD基数排序c++代码

为啥我的基数排序 JAVA 实现比快速排序慢?