桶排序js

桶排序(Bucket Sort) 是一种基于分布的排序算法。它将数据分布到一定数量的桶中,然后对每个桶中的数据进行排序,最后将所有桶中的数据合并成一个有序的结果。桶排序通常用于已知数据分布范围比较均匀的情况。

桶排序的工作原理

  1. 创建桶:首先,将数组的元素映射到若干个桶中,每个桶存储一个范围内的元素。
  2. 桶内排序:然后对每个桶内的元素进行排序(通常可以使用其他排序算法,如插入排序)。
  3. 合并桶:最后,将所有桶中的元素按顺序合并,得到一个有序的数组。

桶排序的时间复杂度

  • 时间复杂度
    • 最优情况和平均情况是 O(n + k),其中:
      • n 是输入数组的大小。
      • k 是桶的数量。
    • 在最坏情况下,如果所有元素都被分配到同一个桶中,桶内排序的时间复杂度就是 O(n²),这通常发生在数据分布极不均匀的情况下。
  • 空间复杂度 :O(n + k),其中 n 是数组元素的数量,k 是桶的数量。

桶排序的适用场景

  • 适用于数据分布较均匀的情况:桶排序在数据范围较大,且数据分布均匀时特别有效。
  • 不适用于数据分布不均匀或极端情况:如果数据分布不均匀,则桶排序的效率会大打折扣。

桶排序的步骤

  1. 确定桶的数量:根据数据的范围和数量,确定需要创建多少个桶。
  2. 数据分配到桶中:将输入数组的每个元素根据其值分配到合适的桶中。
  3. 对每个桶进行排序:可以选择适当的排序算法对每个桶内的元素进行排序,通常使用插入排序。
  4. 合并桶中的元素:按照桶的顺序,依次将每个桶中的元素合并,得到最终的排序结果。
javascript 复制代码
function bucketSort(arr) {
    if (arr.length <= 1) return arr;  // 如果数组只有一个元素,则直接返回

    let min = Math.min(...arr);  // 找到数组中的最小值
    let max = Math.max(...arr);  // 找到数组中的最大值
    let bucketCount = Math.floor(Math.sqrt(arr.length));  // 确定桶的数量,通常选择 sqrt(n)
    
    // 创建桶
    let buckets = Array.from({ length: bucketCount }, () => []);
    
    // 将元素分配到桶中
    arr.forEach(num => {
        let index = Math.floor((num - min) / (max - min + 1) * bucketCount);
        buckets[index].push(num);
    });

    // 对每个桶中的元素进行排序,并合并结果
    return buckets
        .map(bucket => bucket.sort((a, b) => a - b))  // 使用插入排序或其他排序方法对桶内排序
        .flat();  // 扁平化桶数组,返回一个排序好的数组
}

// 测试
let arr = [0.42, 0.32, 0.78, 0.53, 0.60, 0.92, 0.71, 0.23, 0.46, 0.85];
console.log(bucketSort(arr));  // 输出: [0.23, 0.32, 0.42, 0.46, 0.53, 0.60, 0.71, 0.78, 0.85, 0.92]

代码解释

  1. 初始化最小值和最大值 :首先通过 Math.min(...arr)Math.max(...arr) 找到数组中的最小值和最大值。
  2. 确定桶的数量 :一般来说,桶的数量是根据数组的长度来确定的。常见的做法是选择 sqrt(n) 个桶。
  3. 创建桶 :使用 Array.from 创建一个空的二维数组,每个桶对应一个空数组。
  4. 将元素分配到桶中 :通过公式 (num - min) / (max - min + 1) * bucketCount 将元素映射到合适的桶中。这个公式的作用是将数据值映射到 [0, bucketCount-1] 范围内的桶。
  5. 桶内排序 :对每个桶内的元素使用排序算法进行排序,通常选择 插入排序,因为桶内的数据量通常很小。
  6. 合并结果 :使用 map 方法对每个桶进行排序,然后使用 flat() 将多维数组合并为一维数组,最终返回排序后的数组。

桶排序的优缺点

优点:
  • 适用于数据分布均匀的情况:当数据较为均匀地分布时,桶排序能显著提高排序效率,尤其是在数据范围较广时。
  • 稳定性:如果桶内使用的排序算法是稳定的,那么桶排序也是稳定的。
缺点:
  • 需要额外的空间:桶排序需要创建额外的桶数组,所以空间复杂度为 O(n + k)。
  • 对数据分布不均匀的情况性能较差:如果数据分布非常不均匀,则可能会导致某些桶中存储大量元素,导致桶内排序复杂度接近 O(n²),从而降低桶排序的效率。
  • 对于大范围的整数或浮点数排序,桶的选择比较复杂,桶数和桶内排序算法的选择需要根据具体的情况来调整。

适用场景

  • 数据范围有限且均匀分布:例如,排序的是一些浮点数(0到1之间),或者已知数据的分布比较均匀。
  • 需要快速排序的数字数据:比如大规模的评分数据、成千上万的网络请求延迟等,且数据的值域范围已知。
相关推荐
呜哈哈34241 小时前
C++ 哈希表入门:LeetCode经典问题解析2
数据结构·c++·算法·leetcode·链表
编码小袁1 小时前
探索JavaScript的强大功能:从基础到高级应用
开发语言·javascript·ecmascript
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段方式二
前端·javascript·arcgis
XiaoLeisj1 小时前
【优选算法 — 滑动窗口】最大连续1的个数 & 将 x 减到0的最小操作数
java·开发语言·算法·leetcode
此星光明1 小时前
GEE 数据集——美国gNATSGO(网格化国家土壤调查地理数据库)完整覆盖了美国所有地区和岛屿领土的最佳可用土壤信息
javascript·数据库·数据集·美国·数据·gee·土壤
sweetheart7-71 小时前
LeetCode131. 分割回文串(2024冬季每日一题 4)
算法·深度优先·记忆化搜索·回溯·递归
每天进步一大步1 小时前
基于表格滚动截屏(表格全部展开,没有滚动条)
开发语言·前端·javascript
岸榕.2 小时前
C语言 精选真题2
c语言·数据结构·算法
小馒头学python2 小时前
【机器学习】突破分类瓶颈:用逻辑回归与Softmax回归解锁多分类世界
人工智能·python·算法·机器学习·分类·回归·逻辑回归
陈奕迅本讯2 小时前
数据结构-归并排序笔记
数据结构·笔记