跳转到内容

桶排序 ​

桶排序(Bucket Sort)是一种排序算法,它将数组分到有限数量的桶里。每个桶再个别排序(可能使用不同的排序算法或是以递归方式继续使用桶排序)。桶排序是鸽巢排序的一种归纳。

算法原理 ​

桶排序的基本思想是:

  1. 设置一个定量的数组当作空桶
  2. 遍历输入数据,并且把数据一个一个放到对应的桶里
  3. 对每个不是空的桶进行排序(可以使用其他排序算法)
  4. 从不是空的桶里把排好序的数据拼接起来

JavaScript 实现 ​

js
/**
 * 桶排序实现
 * @param {Array} array - 待排序的数组
 * @param {number} bucketSize - 桶的数量,默认为5
 * @returns {Array} 排序后的新数组
 */
function bucketSort(array, bucketSize = 5) {
  if (array.length === 0) return [];
  
  // 找到最大值和最小值
  const min = Math.min(...array);
  const max = Math.max(...array);
  
  // 计算桶的数量
  const bucketCount = Math.floor((max - min) / bucketSize) + 1;
  
  // 创建桶
  const buckets = new Array(bucketCount);
  for (let i = 0; i < bucketCount; i++) {
    buckets[i] = [];
  }
  
  // 将元素分配到各个桶中
  for (let i = 0; i < array.length; i++) {
    const bucketIndex = Math.floor((array[i] - min) / bucketSize);
    buckets[bucketIndex].push(array[i]);
  }
  
  // 对每个桶进行排序并合并结果
  const sorted = [];
  for (let i = 0; i < bucketCount; i++) {
    if (buckets[i].length > 0) {
      // 对桶内元素进行排序(这里使用插入排序)
      insertionSort(buckets[i]);
      // 将排序后的桶合并到结果数组中
      sorted.push(...buckets[i]);
    }
  }
  
  return sorted;
}

/**
 * 插入排序辅助函数
 * @param {Array} array - 待排序的数组
 */
function insertionSort(array) {
  for (let i = 1; i < array.length; i++) {
    const current = array[i];
    let j = i - 1;
    
    while (j >= 0 && array[j] > current) {
      array[j + 1] = array[j];
      j--;
    }
    
    array[j + 1] = current;
  }
}

// 使用示例
const numbers = [64, 34, 25, 12, 22, 11, 90, 5];
const sortedNumbers = bucketSort(numbers);
console.log('原数组:', numbers);
console.log('排序后:', sortedNumbers);

// 浮点数排序示例
const floatNumbers = [0.42, 0.32, 0.33, 0.52, 0.37, 0.47, 0.51];
const sortedFloats = bucketSort(floatNumbers);
console.log('原浮点数组:', floatNumbers);
console.log('排序后:', sortedFloats);

算法特点 ​

  • 时间复杂度:
    • 最坏情况: O(n²) (所有元素都分配到同一个桶中)
    • 最好情况: O(n + k) (元素均匀分布到各个桶中)
    • 平均情况: O(n + n²/k + k),当k接近n时为O(n)
  • 空间复杂度: O(n + k),需要额外的桶存储空间
  • 稳定性: 稳定排序 (如果桶内排序算法是稳定的)
  • 适应性: 不是适应性排序算法

优缺点 ​

优点 ​

  1. 时间复杂度在均匀分布的数据下可以达到线性时间
  2. 是稳定排序算法(取决于桶内排序算法)
  3. 是外部排序的一种形式,适用于大数据集
  4. 可以并行化处理,每个桶可以独立排序

缺点 ​

  1. 需要额外的空间来存储桶
  2. 对输入数据的分布敏感,最坏情况下效率较低
  3. 需要确定合适的桶数量和映射函数
  4. 不适合数据范围很大或分布不均匀的情况

应用场景 ​

  1. 数据分布相对均匀的排序场景
  2. 浮点数排序
  3. 外部排序(处理大量数据)
  4. 需要并行处理的排序任务
  5. 数据范围已知且相对集中的情况

桶排序是一种高效的排序算法,特别适用于数据分布均匀且范围已知的情况。在实际应用中,通常与其他排序算法结合使用。