排序算法(六):桶排序

概念

桶排序:取 n 个桶,根据数组的最大值和最小值确认每个桶存放的数的区间,将数组元素插入到相应的桶里,最后再合并各个桶

复杂度
最好:O(n),每个数都在分布在一个桶里,这样就不用将数插入排序到桶里了(类似于计数排序以空间换时间)。

最坏:O(n²),所有的数都分布在一个桶里。

平均:O(n + k),k表示桶的个数。
代码
  // 桶算法
    function bucket_sort(arr) {
      let bucket = 10
      let max = Math.max(...arr)
      let min = Math.min(...arr)

      // 计算每个桶存放的数值范围,至少为1
      let range = Math.ceil((max - min) / bucket) || 1;

      // 创建二维数组,第一维表示第几个桶,第二维表示该桶里存放的数
      let bucket_arr = Array.from(Array(bucket)).map(() => Array().fill(0));

      arr.forEach(val => {
        // 计算元素应该分布在哪个桶
        let index = parseInt((val - min) / range);
        // 防止index越界,例如当[5,1,1,2,0,0]时index会出现5
        index = index >= bucket ? bucket - 1 : index;

        let temp = bucket_arr[index];
        // 插入排序,将元素有序插入到桶中
        let j = temp.length - 1;
        while (j >= 0 && val < temp[j]) {
          temp[j + 1] = temp[j];
          j--;
        }
        temp[j + 1] = val;
      });
      // 修改回原数组
      let res = [].concat.apply([], bucket_arr);
      arr.forEach((val, i) => {
        arr[i] = res[i];
      })
    }

    var sortArr = [9, 6, 3, 5, 2, 1, 7, 343, 6, 643, 243, 544, 5, 63, 234, 0, 56, 123]
    bucket_sort(sortArr)
    console.log(sortArr)
    // [0, 1, 2, 3, 5, 5, 6, 6, 7, 9, 56, 63, 123, 234, 243, 343, 544, 643]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值