Fork me on GitHub

数据结构与算法——十个排序算法之十 · 基数排序

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

1. 基数排序 vs 计数排序 vs 桶排序

这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:

  • 基数排序:根据键值的每位数字来分配桶;
  • 计数排序:每个桶只存储单一键值;
  • 桶排序:每个桶存储一定范围的数值;

 

2.LSD 基数排序动图演示 (来源 runoob.com)

 

 

 

3. 代码实现

 1 int maxbit(int data[], int n) //辅助函数,求数据的最大位数
 2 {
 3     int maxData = data[0];              ///< 最大数
 4     
 5     /// 先求出最大数,再求其位数,这样有原先依次每个数判断其位数,稍微优化点。
 6     for (int i = 1; i < n; ++i)
 7     {
 8         if (maxData < data[i])
 9             maxData = data[i];
10     }
11     
12     int d = 1;
13     int p = 10;
14     
15     while (maxData >= p)
16     {
17         //p *= 10; // Maybe overflow
18         maxData /= 10;
19         ++d;
20     }
21     
22     return d;
23 /*    int d = 1; //保存最大的位数
24     int p = 10;
25     for(int i = 0; i < n; ++i)
26     {
27         while(data[i] >= p)
28         {
29             p *= 10;
30             ++d;
31         }
32     }
33     return d;*/
34 }
35 
36 void radixsort(int data[], int n)                    //基数排序
37 {
38     int d = maxbit(data, n);
39     int *tmp = new int[n];
40     int *count = new int[10];                        //计数器
41     int i, j, k;
42     int radix = 1;
43     
44     for(i = 1; i <= d; i++)                            //进行d次排序
45     {
46         for(j = 0; j < 10; j++)
47             count[j] = 0; //每次分配前清空计数器
48         
49         for(j = 0; j < n; j++)
50         {
51             k = (data[j] / radix) % 10;             //统计每个桶中的记录数
52             count[k]++;
53         }
54         
55         for(j = 1; j < 10; j++)
56             count[j] = count[j - 1] + count[j];        //将tmp中的位置依次分配给每个桶
57         
58         for(j = n - 1; j >= 0; j--)                 //将所有桶中记录依次收集到tmp中
59         {
60             k = (data[j] / radix) % 10;
61             tmp[count[k] - 1] = data[j];
62             count[k]--;
63         }
64         
65         for(j = 0; j < n; j++)                         //将临时数组的内容复制到data中
66             data[j] = tmp[j];
67             
68         radix = radix * 10;
69     }
70     
71     delete []tmp;
72     delete []count;
73 }

 

 

 

 

 

=================================================================================================================

posted @ 2020-12-12 16:49  索智源  阅读(221)  评论(0)    收藏  举报