基数排序属于“分配式排序”,又称“桶子法”,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用
算法要点
- 基数排序属于桶排序的一种,所以桶排序的问题,在基数排序中依然存在
- 获取序列中最大元素的位数
- 依次根据序列中元素的个位数值,将元素放到0-9号十个桶中
- 将十个桶中的元素一次放回到序列中
- 继续根据每个元素的十位数值执行3步骤、4步骤,直到最大元素的位数
- 每个桶中元素出桶的顺序为先进先出,与队列一致
- 如果需要倒序,则将桶的位置颠倒,即先出9号桶的元素,后出0号桶的元素
- 如果存在小数,则需要将小数全部转为整数才能排序
- 如果存在负数,需要对负数求绝对值后,做倒序排序即可
动画演示

代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| package Sort;
public class Sort {
public int[] radixSort(int[] data) { int max = data[0]; for (int i = 0; i < data.length; i++) { if (data[i] > max) { max = data[i]; } } int length = String.valueOf(max).length();
int[][] bucket = new int[10][data.length]; int[] bucketIndex = new int[10];
for (int place = 0; place < length; place++) { for (int i = 0; i < data.length; i++) { int value = (data[i] / (int) Math.pow(10, place)) % 10; bucket[value][bucketIndex[value]] = data[i]; bucketIndex[value]++; }
int index = 0; for (int b = 0; b < 10; b++) { if (bucketIndex[b] > 0) { for (int i = 0; i < bucketIndex[b]; i++) { data[index] = bucket[b][i]; index++; }
bucketIndex[b] = 0; } } }
return data; } }
|