1 import java.util.Arrays;
2
3 public class Radix {
4 //包含负数的基数排序
5 public static void main(String[] args) {
6 int[] arr = {53, 3, -6, -542, 74, 214};
7 radixSort(arr);
8 System.out.println("基数排序的结果为"+Arrays.toString(arr));
9 }
10
11 public static void radixSort(int[] arr){
12 int max = arr[0];//假设第一个值为最大值
13 for (int i = 0; i<arr.length;i++){
14 if(arr[i] > max){
15 max = arr[i];//寻找最大值
16 }
17 }
18 int maxLength = (max+"").length();//获取最大值的位数
19 int min = arr[0];//假设第一个值为最小值
20 for (int i = 0; i<arr.length;i++){
21 if(arr[i]< min){
22 min = arr[i];//寻找最小值
23 }
24 }
25 if (min < 0){//如果最小值小于0就将每个元素都减去这个负数,使得数组中的最小值为0
26 for(int i = 0; i<arr.length; i++){
27 arr[i] -= min;
28 }
29 }
30
31 int[][] bucket = new int[10][arr.length];
32 int[] bucketElementCounts = new int[10];//用于记录每个桶内有多少数据
33
34 for(int i = 0, n=1;i<maxLength;i++,n*=10){
35 for(int j = 0;j <arr.length;j++){
36 int digitOfElement = arr[j] / n % 10;//每次分别取个位、十位、百位。。。
37 bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
38 bucketElementCounts[digitOfElement] ++;
39 }
40
41 int index = 0;
42 //对每个桶进行遍历
43 for (int k = 0; k<bucketElementCounts.length; k++){
44 if(bucketElementCounts[k] != 0){//只有当前桶内有数据时才遍历该桶进行循环取值
45 for(int l = 0; l <bucketElementCounts[k];l++){
46 arr[index] = bucket[k][l];
47 index++;
48 }
49 }
50 //当取完一个桶时就将其置零,让下一轮重新计数
51 bucketElementCounts[k] = 0;
52 }
53 }
54 if (min<0){//如果最小值小于0.则将数组中的每一个数都加上最小值恢复原来的值
55 for(int i =0;i<arr.length;i++){
56 arr[i] += min;
57 }
58 }
59 }
60 }
基数排序的结果为[-542, -6, 3, 53, 74, 214]