public class jishupaixu { public static void main(String[] args) { int[] arr={53,3,542,748,14,214}; radix(arr); } public static void radix(int[] arr){ //得到数组中最大的数的位数 int max=arr[0]; for (int i=1;i<arr.length;i++){ if(arr[i]>max){ max=arr[i]; } } //得到最大的是几位 int num=(max+"").length(); //第1轮(针对每个元素的个位进行排序处理) //定义一个二维数组,表示10个桶,每一个桶就是一维数组 //二维数组包含十个一维数组,为了防止在放入的时候数据溢出,我们只能一维数组中的时arr.length int[][] bucket=new int[10][arr.length]; //为了记录每个桶中,实际存放了多少个数据,我们定义了一个一维数组来定义各个桶的每次放入的数据个数,buckerElementCounts[0]桶的放入的个数就是在第一个桶中放了0个就行 int[] bucketElementCounts =new int[10]; //循环遍历 for(int i=0,n=1;i<num;i++,n*=10) { //(针对每个元素的对应位进行排序处理),第一个是个位,第二个是十位,第三个是百位 for (int j = 0; j < arr.length; j++) { //取出每个元素的个位得知 int digit = arr[j] / n % 10; //放入到对应的桶中 bucket[digit][bucketElementCounts[digit]] = arr[j]; bucketElementCounts[digit]++; } //按照这个桶的顺序(一维数组的下标以此取出数据,放入原来数组) int index = 0; //遍历每一个桶,并将桶中的数据,放入到原数组 for (int k = 0; k < bucketElementCounts.length; k++) { //如果桶中,有数据,我们才放入到原数组 if (bucketElementCounts[k] != 0) { //循环该桶即第k个桶(以及一维数组) for (int l = 0; l < bucketElementCounts[k]; l++) { //取出元素放入到arr中 arr[index] = bucket[k][l]; index++; } } //第i+1论处理后,需要将每个bucketElementCounts[k]=0 bucketElementCounts[k]=0; } System.out.println("第"+(i+1)+"轮" + Arrays.toString(arr)); } } }
基数排序思考
最新推荐文章于 2024-07-19 22:36:19 发布