1、介绍
1.1、基数排序(RadixSort)属于分配式排序(distribution sor),又称“桶排序(bucket sort)”,通过兼职的各个位的值,将要排序的元素分配至对应的“桶“中,达到排序的作用
1.2、基数排序是一种稳定、高效的排序法,稳定是指排序元素中若有两个相同的元素,排序之后,前面的元素还在前面,后面的元素还在后面
2、实现思路
将所有待比较的数统一为同样的数位长度、数位较短的数前面补零,然后从最低位1开始,依次进行排序,放入对应的桶中,低位排序完成之后将桶中的数据拿出来放入原数组中,然后进行下一位的比较直到最高位完成之后就是一个有序列表了
3、代码实现
package com.lyw.review510;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int[] arr = {512, 33, 245, 167, 78, 89, 60, 92};
radixSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void radixSort(int arr[]) {
// 记录最大值的数据
int max = 0;
// 从桶中拿数据时,记录原数组元素的下标
int index = 0;
// 遍历找到该数组中最大的元素
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
// 获取最大元素的长度,用于取模
int maxLength = (max + "").length();
// 用于接收百位,千位,十位,个位上的值
int digitOfElement = 0;
// 存数据的桶
int[][] bucket = new int[10][arr.length];
// 记录每个桶中元素的个数
int[] bucketElementCount = new int[10];
// 用于遍历取模的值
for (int i = 0, n = 1;i < maxLength;i++, n *= 10) {
// 遍历数组中的每个元素
for (int j = 0;j < arr.length;j++) {
// 获取对应元素个位,百位,千位上的值
digitOfElement = arr[j] / n % 10;
// 将对应的个位,十位,百位上的值放入对应的桶中
bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];
// 记录每个桶中的数据
bucketElementCount[digitOfElement]++;
}
index = 0;
// 从桶中遍历拿数据
for (int j = 0;j < bucketElementCount.length;j++) {
// 如果当前桶中有数据
if (bucketElementCount[j] != 0) {
// 遍历当前桶中的个数
for (int k = 0;k < bucketElementCount[j];k++) {
// 然后通过个数获取对应桶中的元素放入原数组中,这里拿数据是先入先出的方式
arr[index] = bucket[j][k];
index++;
}
}
// 将对应桶中的数据清零,方便下一次存放数据
bucketElementCount[j] = 0;
}
}
}
}
仅供参考
这里指的是个位 ↩︎