「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」
桶排序
介绍
桶排序 它也是 计数排序 算法的进阶版本。
它是通过分成具体数量的桶,通过获取待排序里面的 最大值 和 最小值 后,进行范围的分布,依次放入桶中。
最后在每个桶的里面再进行任意7种 比较排序 算法的排序,这样做的目的是会减少比较的次数。
最后再将每个桶里面的数据,依次拼接后,就是最终排序后的结果。
-
动图演示
详解
-
分桶操作
给定一个,将数据项 分为多少桶的常量值,bucketCount
-
获取 最大值 和 最小值
这里通过设置 minValue 和 maxValue。
const maxValue = Math.max(...arr) const minValue = Math.min(...arr) -
求出每个桶的 区间范围
通过最大值与最小值 再与 桶数量 bucketCount 进行相除,得到区间范围
bucketSize = Math.floor((maxValue - minValue + 1) / bucketCount) -
创建每个桶,并往桶里分发数据
通过循环,创建每个桶,然后再循环数组 arr,通过计算得到 当前值在那个范围,最后进行分发操作。
Math.floor((arr[i] - minValue) / bucketCount) -
桶单独排序
每个桶再进行单独的排序,这里的排序 使用7种 比较排序 里的任意一种即可。直接使用代码就可以,这里为了方便,暂时是使用了数组的 sort 方法,来进行排序。
bucket[i].sort() -
合并
最后进行每个桶的合并操作,从每个桶依次取出里面 已排序的结果,push 到 result 结果数组中。就会得到最终我们想要的 桶排序 结果
完整代码
/**
* 桶排序,bucketCount是分几个桶来存储
* @param {array} arr
* @param {number} bucketCount
* @returns
*/
const bucketSort = (arr, bucketCount) => {
const result = []
// 找出最大值和最小值,为给每个桶分配大小做准备
const maxValue = Math.max(...arr)
const minValue = Math.min(...arr)
// 求得每个桶的size
bucketSize = Math.floor((maxValue - minValue + 1) / bucketCount)
bucket = new Array(bucketCount)
for (let i = 0; i < bucketCount; i++) {
bucket[i] = []
}
// 往桶里放数据
for (let i = 0; i < arr.length; i++) {
bucket[Math.floor((arr[i] - minValue) / bucketCount)].push(arr[i])
}
// 对每个桶进行单独排序,放进结果数组中
for (let i = 0; i < bucketCount; i++) {
bucket[i].sort()
for (let j = 0; j < bucket[i].length; j++) {
result.push(bucket[i][j])
}
}
return result
}
// 测试
arr = [5, 4, 3, 2, 1, 8, 6, 4, 7, 6]
console.log(bucketSort(arr, 3))
总结
桶排序 是 非比较排序,也是一种稳定的排序方式。
是 计数排序 的进阶版,而且 桶排序 还用到了 其他排序 的相关知识。