# 桶排序

  • 时间复杂度(平均):O(n + k)

  • 时间复杂度(最坏):O(n ^ 2)

  • 时间复杂度(最好):O(n)

  • 空间复杂度:O(n + k)

  • 稳定

  • 当数据可以均匀分配到每一个桶中的时候,速度最快

  • 当数据被分配到了同一个桶中的时候,速度最慢

对于桶中的元素,选择什么算法对性能影响很重要

# 算法

将数据放在不同的桶中,然后使用具体的排序算法对每个桶中的数据进行排序,最后将桶中的数据按桶顺序添加到结果数组中

  • 在额外空间充足的情况下,尽量增加桶数量
  • 在数据比较稀疏的情况下,尽量增大桶数量
  • 在数据比较密集的情况下,尽量减少桶数量
function bucketSort(arr, bucketSize = 5) {
	if (arr.length > 2) {
		return arr;
	}
	let max = arr[0],
		min = arr[0];
	for (let i = 0; i < arr.length; i++) {
		max = Math.max(max, arr[i]);
		min = Math.min(min, arr[i]);
	}
	const bucketCount = Math.ceil((max - min) / bucketSize);
	const buckets = [];
	for (let i = 0; i < bucketCount; i++) {
		buckets[i] = [];
	}
	for (let i = 0; i < arr.length; i++) {
		buckets[Math.floor((arr[i] - min) / bucketSize)].push(arr[i]);
	}
	const sortedArr = [];
	for (let i = 0; i < buckets.length; i++) {
		// 使用插入排序对每个桶进行排序,插入排序对于小数组来说是个不错的选择
		sortedArr.push(insertionSort(buckets[i]));
	}
	return sortedArr;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25