1. 原理
基数排序又称为“桶子法”,从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。等到低位排完得到一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。
LSD——从低位向高位排
MSD——从高位向低位排
时间复杂度:O(N*digit)
空间复杂度:O(N)
稳定性:稳定
2. 算法执行步骤
(1)遍历序列找出最大的数(为的是确定最大的数是几位数);
(2)开辟一个与数组大小相同的临时数组tmp;
(3)用一个count数组统计原数组中某一位(从低位向高位统计)相同的数据出现的次数;
(4)用一个start数组计算原数组中某一位(从最低位向最高位计算)相同数据出现的位置;
(5)将桶中数据从小到大用tmp数组收集起来;
(6)重复(3)(4)(5)直到所有位都被统计并计算过,用tmp收集起来;
(7)将tmp数组拷回到原数组中
3 . 图示
4. 代码
public static void main(String[] args) {
int[] arrs = RandomArr.createIntArr(40, 0, 10000);
int[] arrs2 = Arrays.copyOf(arrs, arrs.length);
Arrays.stream(arrs).forEach(l -> {
System.out.print(l + " ");
});
System.out.println();
// System.out.println((Math.floor(1345 / (Math.pow(10, 2 - 1))) % 10));
RadixSort(arrs);
Arrays.stream(arrs).forEach(l -> {
System.out.print(l + " ");
});
System.out.println();
Arrays.stream(arrs2).sorted().forEach(l -> {
System.out.print(l + " ");
});
}
public static void RadixSort(int[] arrs) {
// 1、找到其最大值
int largest = arrs[0];
for (int i = 1; i < arrs.length; i++) {
if (arrs[i] > largest) {
largest = arrs[i];
}
}
int len = String.valueOf(largest).length();
// 2、用10个桶来装数据
List[] listArr = new List[10];
// 3、逐位比较
for (int i = 0; i < len; i++) {
for (int j = 0; j < arrs.length; j++) {
int index = (int) (Math.floor(arrs[j] / (Math.pow(10, i))) % 10);
if (listArr[index] == null) {
List list = new ArrayList<>();
list.add(arrs[j]);
listArr[index] = list;
} else {
listArr[index].add(arrs[j]);
}
}
// 4、对桶内元素进行排序
for (int j = 0, index = 0; j < listArr.length; j++) {
if (listArr[j] != null && listArr[j].size() > 0) {
Collections.sort(listArr[j]);
// 5、把排序好的数据重新还原到原数组
for (; listArr[j].size() > 0; ) {
arrs[index] = (int) listArr[j].get(0);
listArr[j].remove(0);
index++;
}
}
}
}
}