import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int[] array = new int[8];
int len = array.length;
for (int i = 0; i < len; i++) {
array[i] = (int) (Math.random() * 100);
}
System.out.println("待排序的数据为:" + Arrays.toString(array));
radixSort(array);
System.out.println("排序过后的数据为:" + Arrays.toString(array));
}
/*
按照位数把数放到相应的桶里面,直到排序完成~
*/
public static void radixSort(int[] array) {
int max = array[0];
int len = array.length;
for (int i = 0; i < len; i++) {
if (max < array[i]) {
max = array[i];
}
}
int maxLength = (max + "").length(); //数组中最大数的位数
int[][] bucket = new int[10][len]; //定义10个桶,每个桶的大小都等于数组的大小。很明显,基数排序是以空间换时间的算法。
int[] bucketCount = new int[10]; //用于记录每个桶中各有多少元素
int digit = 0; //当前数据在指定位上的数字
for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
//按位将数据放置进桶内
for (int j = 0; j < len; j++) {
digit = array[j] / n % 10;
bucket[digit][bucketCount[digit]++] = array[j];
}
int index = 0;
//按桶的顺序把数据放回数组
for (int j = 0; j < 10; j++) {
//如果桶内有数据
if (bucketCount[j] != 0) {
for (int k = 0; k < bucketCount[j]; k++) {
array[index++] = bucket[j][k];
}
}
bucketCount[j] = 0; //把桶内数据拿完后要置0,为下一次放数据做准备
}
}
}
}
如果数据中有负数,可以把数组中的每个值都加上最小值的绝对值,排序完成后,把数组中的每个值都减去最小值的绝对值就好了。