基数排序(Radix Sort)是一种非比较的整数排序算法。它通过从最低位开始,逐个位数排序,从而达到整体排序的效果。
我们可以实现基数排序算法如下:
public void radixSort(int[] nums) {
// 1. 找到数组中的最大数,确定排序的趟数
int maxVal = Integer.MIN_VALUE;
for (int num : nums) maxVal = Math.max(maxVal, num);
int maxDigit = 0;
while ((maxVal /= 10) != 0) maxDigit++;
// 2. 设立10个桶,用于存储每个桶中的数字
List<List<Integer>> bucket = new ArrayList<>();
for (int i = 0; i < 10; i++) {
bucket.add(new ArrayList<>());
}
// 3. 进行maxDigit次排序
for (int i = 0, radix = 1; i < maxDigit; i++, radix *= 10) {
// 4. 将数据分到对应的桶中
for (int num : nums) {
int numLast = (num / radix) % 10;
bucket.get(numLast).add(num);
}
// 5. 从桶中取出数据,放回nums数组
int index = 0;
for (int j = 0; j < 10; j++) {
for (int num : bucket.get(j)) {
nums[index++] = num;
}
bucket.get(j).clear();
}
}
}
算法流程:
- 找到最大数,确定排序的趟数。
- 设立10个桶,用于存储每个位的值。
- 进行maxDigit次排序,每次按一个位数排序。
- 将数据放入对应桶,取出末位的值确定桶号。
- 从桶中取出数据,放回原数组,清空桶。
- 重复步骤4和5,完成一趟排序。
- 重复步骤3、4、5和6,直到maxDigit趟排序完成。
时间复杂度O(kn),k为数组最大值的位数,空间复杂度O(n)。
所以,基数排序的关键是:
- 找到最大数确定排序趟数。
- 设立10个桶,用于暂存每个位数的值。
- 按位数进行排序,每次取出末位的值放入对应桶。
- 从桶中取出数据后清空桶。
- 重复步骤3和4,直到所有位数排序完成。