基数排序
核心:从元素的个位开始,按照数字放入0-19(不包含负数0-9)号桶,顺序取出,再按照倒数第二位排序
动图(不考虑负数)
代码(不考虑负数)
public static void radixSort(int[] arr) {
// 二维数组模拟桶
int[][] bucket = new int[10][arr.length];
// 一维数组模拟索引
int[] bucketCounts = new int[10];
// 确定数组最大数的位数
int max = arr[0];
for (int n = 0; n < arr.length; n++) {
if (arr[n] > arr[0]) {
max = arr[n];
}
}
int num = (max + "").length();
for (int i = 0; i < num; i++) {
for (int j = 0; j < arr.length; j++) {
int digit = (int) ((arr[j] / Math.pow(10, i)) % 10);
bucket[digit][bucketCounts[digit]] = arr[j];
bucketCounts[digit]++;
}
int index = 0;
for (int k = 0; k < bucketCounts.length; k++) {
if (bucketCounts[k] != 0) {
for (int l = 0; l < bucketCounts[k]; l++) {
arr[index++] = bucket[k][l];
}
}
bucketCounts[k] = 0;
}
}
}
代码(考虑负数)
public static void radixSort(int[] arr) {
int[][] bucket = new int[20][arr.length];
int[] bucketCounts = new int[20];
int max = arr[0];
for (int n = 0; n < arr.length; n++) {
if (arr[n] > arr[0]) {
max = arr[n];
}
}
int num = (max + "").length();
for (int i = 0; i < num; i++) {
for (int j = 0; j < arr.length; j++) {
int digit = (int) ((arr[j] / Math.pow(10, i)) % 10)+10;
bucket[digit][bucketCounts[digit]] = arr[j];
bucketCounts[digit]++;
}
int index = 0;
for (int k = 0; k < bucketCounts.length; k++) {
if (bucketCounts[k] != 0) {
for (int l = 0; l < bucketCounts[k]; l++) {
arr[index++] = bucket[k][l];
}
}
bucketCounts[k] = 0;
}
}
}
本文动图来源:https://www.cnblogs.com/onepixel/p/7674659.html