基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。具体步骤如下: 首先定义一个maxbits函数,用于计算数组中最大数的位数。这个函数遍历数组,找到最大的数,然后通过不断除以10并计数的方式计算出最大数的位数。 radixSort函数是基数排序的主函数,它接受一个整数数组作为参数。如果数组为空或长度小于2,则直接返回。否则,调用重载的radixSort函数,传入数组、起始索引、结束索引和最大位数。 重载的radixSort函数负责实际的排序过程。它首先创建一个辅助数组help,用于存储临时结果。然后,对于每一位(从最低位到最高位),执行以下操作: 初始化一个计数数组count,用于记录每个桶中的元素的个数。计数数组的长度为基数(在这里是10)。 遍历数组,根据当前位的值将元素放入对应的桶中,并更新计数数组。例如,如果当前位是十位数,那么将元素按照十位数的值放入对应的桶中。 对计数数组进行累加操作,使其变为前缀和数组。这样,每个桶中的元素个数就是前面所有桶中元素的个数之和。 反向遍历数组,根据计数数组中的值将元素放入辅助数组help中的正确位置。这样可以保证每个桶中的元素都按照正确的顺序排列。 将辅助数组help中的元素复制回原数组。这样,原数组就完成了按照当前位的排序。 getDigit函数用于获取指定位数上的数字。它接受一个整数x和一个位数d作为参数,返回x的第d位数字。这个函数通过将x除以10的d-1次方,然后取余数来实现。
public class test8 { public static void radixSort(int[] arr){ if(arr ==null || arr.length <2){ return; } radixSort(arr , 0, arr.length -1 , maxbits(arr)); } public static int maxbits(int[] arr){ int max = Integer.MIN_VALUE; for (int i = 0; i < arr.length; i++) { max = Math.max(max , arr[i]); } int res = 0; while(max!=0){ res++; max /=10; } return res; } public static void radixSort(int[] arr , int L , int R , int digit){ final int radix = 10; int i =0; int j= 0; int[] help = new int[R - L+1]; for (int d = 1; d <= digit; d++) { int[] count = new int[radix]; for (i = L; i < R; i++) { j = getDigit(arr[i] , d); count[j]++; } for (i = 1; i< radix; i++) { count[i] = count[i] + count[i-1]; } for ( i = R; i >= L; i--) { j = getDigit(arr[i] ,d); help[count[j] -1] = arr[i]; count[j]--; } for ( i = L , j =0 ; i <= R; i++ , j++) { arr[i] = help[j]; } } } public static int getDigit(int x ,int d ){ int num1 = (int)Math.pow(10,d-1); int num2 = x/num1; return num2%10; } }