第一步:计算出差值;
第二步:创建空桶;
第三步:把原始数组的元素分配到各个桶中;
第四步:分别对各个桶做排序;
第五步:合并排序后的桶,输出排序结果。
核心思想:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。
桶排序的性能不稳定,如果元素的分布极不均衡,在极端情况下时间复杂度是O(nlogn)
适用场景
- 桶排序比较适合用在外部排序中。
- 外部排序就是数据存储在外部磁盘且数据量大,但内存有限,无法将整个数据全部加载到内存中。
function bucketSort(array, bucketSize = 5) {
if (array.length <= 1) return array;
var buckets = createBuckets(array, bucketSize) // 创建桶并将元素分布到不同的桶中
return sortBuckets(buckets);
}
// 创建桶并将元素分布到不同的桶中
function createBuckets(array, bucketSize) { // bucketSize表示每个桶的容量
var maxValue = Math.max(...array); // ES6的骚操作
var minValue = Math.min(...array); // ES6的骚操作
var bucketCount = Math.ceil((maxValue - minValue) / bucketSize) // 桶排序的第一个重要步骤是计算每个桶中需要分布的元素个数
var buckets = [];
for (let i = 0; i < bucketCount; i++) {
buckets[i] = []; // 将每个桶置空初始化
}
for (var i = 0; i < array.length; i++) {
var bucketIndex = Math.floor((array[i] - minValue) / bucketSize); // 计算要将元素放到哪个桶中
buckets[bucketIndex].push(array[i]); // 将元素存入各个桶中
}
return buckets
}
// 将每个桶进行排序
function sortBuckets(buckets) {
var sortedArray = [];
for (let i = 0; i < buckets.length; i++) {
if (buckets[i] != null) {
sortedArray.push(...(buckets[i]).sort());
}
}
return sortedArray;
}