算法步骤
动图演示
元素分布在桶中:
然后,元素在每个桶中排序:
复杂度
时间复杂度 = O(n+n(logn-logm)) 空间复杂度 = O(n+m)
代码实现
public static void bucketsort(int[] arr) {
int len = arr.length,min = arr[0],max = arr[len - 1];
for (int i:arr) {
if (i < min) {
min = i;
} else if (i > max) {
max = i;
}
}
int bucketCount = (max - min) / 10 + 1;
int[][] buckets = new int[bucketCount][0];
for (int i = 0; i < len; i++) {
int index = (arr[i] - min) / 10;
buckets[index] = arrAppend(buckets[index],arr[i]);
}
int step = 0;
for (int[] bocket: buckets) {
if (bocket.length <= 0) {
continue;
}
bocket = QuickSort.quick_sort2(bocket,0,bocket.length - 1);
for (int value:bocket) {
arr[step++] = value;
}
}
}
/**
* 自动扩容,并保存数据
*
* @param arr
* @param value
*/
private static int[] arrAppend(int[] arr, int value) {
arr = Arrays.copyOf(arr, arr.length + 1);
arr[arr.length - 1] = value;
return arr;
}