【算法与数据结构】包含负数的基数排序

 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]
原文地址:https://www.cnblogs.com/DJames23/p/13306119.html