package com.example.sort.radix;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int[] arr = {421, 240, 115, 532, 305, 430, 124};
// 求最大数位数
int temp = arr[0];
for (int i = 1; i < arr.length; i++) {
if (temp < arr[i]) {
temp = arr[i];
}
}
int bit = String.valueOf(temp).length();
int[] result = sort(arr, bit);
System.out.println(Arrays.toString(result));
}
/**
* 基数排序
*
* @param arr
*/
private static int[] sort(int[] arr, int bit) {
//创建临时存储数组
int[] result = new int[arr.length];
// 建立0-9容器
int[] count = new int[10];
for (int i = 0; i < bit; i++) {
// 10的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.println(num + "");
count[num]++;
}
// 计数排序的优化
for (int m = 1; m < count.length; m++) {
count[m] = count[m] + count[m - 1];
}
for (int n = arr.length - 1; n >= 0; n--) {
int num = arr[n] / division % 10;
result[--count[num]] = arr[n];
}
// 一轮结束,替换原数组arr的位置
System.arraycopy(result, 0, arr, 0, arr.length);
// 清空count数组
Arrays.fill(count, 0);
}
return result;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
private static void print(int[] arr) {
for (int i : arr) {
System.out.print(i + " ");
}
}
}