js实现桶排序的一种方法

696 阅读1分钟

第一步:计算出差值;

第二步:创建空桶;

第三步:把原始数组的元素分配到各个桶中;

第四步:分别对各个桶做排序;

第五步:合并排序后的桶,输出排序结果。

核心思想:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。

桶排序的性能不稳定,如果元素的分布极不均衡,在极端情况下时间复杂度是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;
}