第一轮:
第二轮:
往下省略...
//桶排序 public static int[] bucketSort(int[] arr){ //1.取最大 ,最小值 int max=0,min=0; for (int i = 0; i < arr.length; i++) { if(i==0){ max=arr[i]; min=arr[i]; }else{ if(arr[i]>max)max=arr[i]; if(arr[i]<min)min=arr[i]; } } //小于0时可能会报错 ,先把数组转成正数 if(min<0){ for (int i = 0; i < arr.length; i++) { arr[i] -= min; } } int maxLength = (max+"").length();//获取是几位数,便于之后取/ int[][] bucket = new int[10][arr.length]; int[] bucketElementCounts = new int[10]; //没轮取当前位置的值排序(各位,十,百)从低往高 for (int n = 0, g=1; n < maxLength; n++,g*=10) { for (int i = 0; i < arr.length; i++) { int digitOfElement = arr[i]/g % 10;// 求各(个,十,百....)位数的数值 bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[i];// [个位数值][该数存放的第几个] bucketElementCounts[digitOfElement]++; //桶中存放的量+1 } // 存放完毕后再取回原数组 int index = 0; //bucketElementCounts每轮置0 循环bucketElementCounts.length所以不用没轮把bucket置空 for (int j = 0; j < bucketElementCounts.length; j++) { if (bucketElementCounts[j] != 0) { // 表示存储的有数据 for (int k = 0; k < bucketElementCounts[j]; k++) { arr[index] = bucket[j][k]; index++; } } bucketElementCounts[j] = 0;//为下一轮初始化 } System.out.println(Arrays.toString(arr)); } //小于0时上面-的min 补回来 if(min<0){ for (int i = 0; i < arr.length; i++) { arr[i] += min; } } return arr; }