思路:基数排序是一种基于“桶”的排序,它的排序思路是,先创建10个桶,分别存放0-9这10个数,先按数组中每个数的个位数放进对应的桶中,然后取出,那么数组的个位数就排序完成了,依次排序十位数、百位数等,整个排序就完成了。
对数组[55,22,31,10,14,38,44,49,15,52]进行基数排序:
最大数是两位,所以只需要经过两次排序就可以完成。第一遍,以个位数排序,结果如下:
第二遍,以十位数排序,结果如下:
代码实现:
public class RadioSort {
public static void radioSort(int[] arr) {
if (arr == null || arr.length < 2) return;
int n = arr.length;
// 找最大值
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) max = arr[i];
}
// 计算最大值的位数
int count = 0;
while (max > 0) {
count++;
max /= 10;
}
// 创建并初始化10个桶
List<List<Integer>> lists = new ArrayList<>();
for (int i = 0; i < 10; i++) {
lists.add(new ArrayList<>());
}
for (int i = 1; i <= count; i++) {
for (int j = 0; j < n; j++) {
// 获取每个数字的最后第i位是什么
int temp = (arr[j] / (int) Math.pow(10, i - 1)) % 10;
// 放进对应的桶里
lists.get(temp).add(arr[j]);
}
// 合并放回原数组
int k = 0;
for (int j = 0; j < 10; j++) {
for (Integer value : lists.get(j)) {
arr[k++] = value;
}
// 清空桶
lists.get(j).clear();
}
}
}
}
性质:
1.时间复杂度:O(kn)
2.空间复杂度:O(n+k)
3.稳定排序
4.非原地排序
总结:十大排序算法的性质