基数排序
时间复杂度 O(kn),k 为要排序的数字的最大长度
例如对 342、58、576、356 进行排序
不足的位数看做是 0
342 058 576 356
第一步
按照个位将数字依次放到不同的位置
0:
1:
2: 342
3:
4:
5:
6: 576, 356
7:
8: 058
9:
把上边的数字依次拿出来,组成新的序列 342 576 356 058,然后按十位继续放到不同的位置。
0:
1:
2:
3:
4: 342
5: 356 058
6:
7: 576
8:
9:
把上边的数字依次拿出来,组成新的序列 342 356 058 576,然后按百位继续装到不同的位置。
0: 058
1:
2:
3: 342 356
4:
5: 576
6:
7:
8:
9:
把数字依次拿出来,最终结果就是 58 342 356 576
JAVA 实现:
import java.util.ArrayList;
import java.util.Arrays;
public class BaseSort {
public int[] baseSort(int[] nums) {
long exp = 1;
// 找出数组最大值
int max = Arrays.stream(nums).max().getAsInt();
// 二维数组,存储当前数位是 0-9 的一维数组
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
// 创建 10 个空数组
for (int i = 0; i < 10; i++) {
lists.add(new ArrayList<Integer>());
}
// 从个位开始,进行循环
while (max >= exp) {
// 清空数组
for (ArrayList<Integer> list : lists) {
list.clear();
}
// 计算当前位的数组,加入到对应的数组
for (int num : nums) {
int x = (int) ((num / exp) % 10);
lists.get(x).add(num);
}
// 将本次循环结果放入 nums
int i = 0;
for (ArrayList<Integer> list : lists) {
for (Integer integer : list) {
nums[i++] = integer;
}
}
exp *= 10;
}
// String s = Arrays.toString(nums);
// System.out.println(s);
return nums;
}
}