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]