/** * @author 皖 * @data 2020.5.14 */ public class BuckeStort{ public static int[]BuckeStort(int[] arr){ if (arr==null||arr.length<2)return arr;
int n=arr.length; int max=arr[0]; int min=arr[0]; //寻找数组中的最大值与最小值 for (int i = 1; i <n; i++) { if (min>arr[i]) min=arr[i]; if (max<arr[i]) max=arr[i]; } //弄一个大小为min偏移值 int d=max-min; //创建 d / 5 + 1 个桶,第 i 桶存放 5*i ~ 5*i+5-1范围的数 int bucktNum=d/5+1; ArrayList<LinkedList<Integer>>bucketList=new ArrayList<>(bucktNum); //初始化桶 for (int i = 0; i <bucktNum ; i++) { bucketList.add(new LinkedList<>());
} //遍历数组,将每个元素分别插入桶中 for (int i = 0; i <n ; i++) { bucketList.get((arr[i]-min)/d).add(arr[i]-min);
} //对桶内元素进行排序 for (int i = 0; i <bucktNum ; i++) { Collections.sort(bucketList.get(i));
} //这里然后把排好序之后的数据进行合并汇总放回原来的数组里面 int k=0; for (int i = 0; i <bucktNum; i++) { for (Integer t:bucketList.get(i)){ arr[k++]=t+min; }