@Override publicint[] sort(int[] arr) { // 遍历数据,获取数据范围 // 通常不需要该步骤,比如学分0-100,年龄0-120 int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for (int value : arr) { max = Math.max(max, value); min = Math.min(min, value); }
// 根据数据范围和数据量计算桶个数 // 通常不需要该步骤 int bucketNum = (max - min) / arr.length + 1; ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum); for (int i = 0; i < bucketNum; i++) { bucketArr.add(new ArrayList<>()); }
// 遍历数据,将每个元素放入桶 for (int value : arr) { // 计算数据应放入的桶下标 int num = (value - min) / (arr.length); bucketArr.get(num).add(value); }
// 对每个桶进行排序 for (ArrayList<Integer> integers : bucketArr) { Collections.sort(integers); }
// 依次从桶中取出数据 int[] result = newint[arr.length];
int i = 0; for (ArrayList<Integer> values : bucketArr) { for (Integer value : values) { result[i++] = value; } }