基数排序
基数排序
基本思想:
将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
图文说明:
将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序。
代码实现
public static void radixSort(int[] arr) {
//根据推导,得出最终基数排序的代码
//1.得到数组中最大的数的位数
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) max = arr[i];
}
//得到最大数是几位数
int maxLength = (max + "").length();
//定义一个二维数组,表示10个桶,每个桶就是一个一维数组
//说明
//1.二维数组包含10个一维数组
//2.为了防止再放入数的时候,数据溢出,每个桶的大小定为arr.length
int[][] bucket = new int[10][arr.length];
//为了记录每个桶中,实际存放了多少个数
//我们定义一个一维数组来记录各个桶每次放入数据的个数,同时也代表下一个放入对应桶中的索引
//bucketElementCount[0] 就是记录的 bucket[0] 桶中的数据个数
int[] bucketElementCount = new int[10];
//用循环将代码处理
for (int k = 0, n = 1; k < maxLength; k++, n *= 10) {
//针对每个元素的对应位进行排序处理,第一次是个位,第二次是十位
for (int i = 0; i < arr.length; i++) {
//取出每个元素对应位的值
int digitOfElement = arr[i] / n % 10;
//放入到对应的桶中
bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[i];
//更新对应桶中元素的个数
bucketElementCount[digitOfElement]++;
}
int index = 0;//记录从桶取出数放入原始数组的当前索引
//将桶中的数取出放入原始数组
for (int i = 0; i < bucketElementCount.length; i++) {
//如果桶中有数据才放入原数组
if (bucketElementCount[i] > 0) {
//循环第i个一维数组,放入
for (int j = 0; j < bucketElementCount[i]; j++) {
//取出元素放入到arr
arr[index++] = bucket[i][j];
}
//取完对应桶中所有数后,将记录对应桶数据个数的值清0
bucketElementCount[i] = 0;
}
}
}
}