桶排序之计数排序和基数排序
桶排序
一种常见的排序算法,工作原理是将数组分到有限数量的桶子里,每个桶子再个别进行排序(会使用递归的方式继续使用桶排序进行排序或者使用其他的排序算法).
计数排序
计数排序是桶排序的一种特殊情况
- 从图中可以看出,待排序数字在[1,9]范围内;
- 创建9个空桶,将待排序数字分别放在对应的桶中;
- 再依次将桶中的元素按照桶的顺序拿出;
代码实现:
public class CountSort {
public static void main(String[] args) {
int[] arr = {2, 4, 2, 3, 7, 1, 1, 1, 0, 5, 6, 9, 8, 7, 4, 0, 9};
int[] result = sort(arr);
System.out.println(Arrays.toString(result));
}
static int[] sort(int[] arr){
//新建一个数组用来存放最终的结果
int[] result = new int[arr.length];
//10个桶
int[] count = new int[10];
//计数,计算每个桶中有多少个数字
for (int i = 0; i < arr.length; i++) {
count[arr[i]]++;
}
System.out.println(Arrays.toString(count));
//累加数组,得到该桶的最后一个数字在最终数组中排在第几位的数字
for (int i = 1; i < count.length; i++) {
count[i] = count[i] + count[i-1];
}
System.out.println(Arrays.toString(count));
//倒序迭代,将待排数字拿出放入累加数组中,得到结果数组中的位置,放入(建议拿出笔来算算)
for (int i = arr.length-1; i >= 0; i--) {
result[--count[arr[i]]] = arr[i];
}
return result;
}
}
基数排序
- 算法思想:多关键字排序;
- 同样,将待排数字依据该数字的个位,十位.百位,千位分别放入桶中;
代码实现:
public class RadixSort {
public static void main(String[] args) {
int[] arr = {421, 240, 225, 532, 305, 430, 124};
int[] result = sort(arr);
System.out.println(Arrays.toString(result));
}
public static int[] sort(int[] arr){
int[] result = new int[arr.length];
int[] count = new int[10];
for (int i = 0; i < 3; i++) {
int division = (int) Math.pow(10, i);
System.out.println(division);
//得到余数
for (int j = 0; j < arr.length; j++) {
int num = arr[j]/division % 10;
System.out.print(num + " ");
count[num]++;
}
System.out.println();
System.out.println(Arrays.toString(count));
for (int m = 1; m < count.length; m++) {
count[m] = count[m] + count[m-1];
}
System.out.println(Arrays.toString(count));
for (int n = arr.length-1; n >= 0; n--) {
int num = arr[n]/division % 10;
result[--count[num]] = arr[n];
}
System.arraycopy(result, 0, arr, 0, arr.length);
Arrays.fill(count, 0);
}
return result;
}
}
Mamba Never Out
R.I.P Mamba
来源:CSDN
作者:fungnotl
链接:https://blog.csdn.net/FungLi_notLove/article/details/104089874