数据结构与算法——十个排序算法之十 · 基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
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 }
=================================================================================================================


浙公网安备 33010602011771号