排序算法-桶排序

503 阅读2分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

桶排序

介绍

桶排序 它也是 计数排序 算法的进阶版本。

它是通过分成具体数量的桶,通过获取待排序里面的 最大值 和 最小值 后,进行范围的分布,依次放入桶中。

最后在每个桶的里面再进行任意7种 比较排序 算法的排序,这样做的目的是会减少比较的次数。

最后再将每个桶里面的数据,依次拼接后,就是最终排序后的结果。

  • 动图演示

    2169973-20201114170205222-2056298516.gif

详解

  • 分桶操作

    给定一个,将数据项 分为多少桶的常量值,bucketCount

  • 获取 最大值 和 最小值

    这里通过设置 minValuemaxValue

        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()
    
  • 合并

    最后进行每个桶的合并操作,从每个桶依次取出里面 已排序的结果,pushresult 结果数组中。就会得到最终我们想要的 桶排序 结果

完整代码

    /**
     * 桶排序,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))

总结

桶排序 是 非比较排序,也是一种稳定的排序方式。

计数排序 的进阶版,而且 桶排序 还用到了 其他排序 的相关知识。