桶排序
1 算法步骤
-
设置固定数量的空桶。
-
把数据放到对应的桶中。
-
对每个不为空的桶中数据进行排序。
-
拼接不为空的桶中数据,得到结果
-
1//Java 代码实现 2public class BucketSort implements IArraySort { 3 4 private static final InsertSort insertSort = new InsertSort(); 5 6 @Override 7 public int[] sort(int[] sourceArray) throws Exception { 8 // 对 arr 进行拷贝,不改变参数内容 9 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); 10 11 return bucketSort(arr, 5); 12 } 13 14 private int[] bucketSort(int[] arr, int bucketSize) throws Exception { 15 if (arr.length == 0) { 16 return arr; 17 } 18 19 int minValue = arr[0]; 20 int maxValue = arr[0]; 21 for (int value : arr) { 22 if (value < minValue) { 23 minValue = value; 24 } else if (value > maxValue) { 25 maxValue = value; 26 } 27 } 28 29 int bucketCount = (int) Math.floor((maxValue - minValue) / bucketSize) + 1; 30 int[][] buckets = new int[bucketCount][0]; 31 32 // 利用映射函数将数据分配到各个桶中 33 for (int i = 0; i < arr.length; i++) { 34 int index = (int) Math.floor((arr[i] - minValue) / bucketSize); 35 buckets[index] = arrAppend(buckets[index], arr[i]); 36 } 37 38 int arrIndex = 0; 39 for (int[] bucket : buckets) { 40 if (bucket.length <= 0) { 41 continue; 42 } 43 // 对每个桶进行排序,这里使用了插入排序 44 bucket = insertSort.sort(bucket); 45 for (int value : bucket) { 46 arr[arrIndex++] = value; 47 } 48 } 49 50 return arr; 51 } 52 53 /** 54 * 自动扩容,并保存数据 55 * 56 * @param arr 57 * @param value 58 */ 59 private int[] arrAppend(int[] arr, int value) { 60 arr = Arrays.copyOf(arr, arr.length + 1); 61 arr[arr.length - 1] = value; 62 return arr; 63 } 64 65}