桶排序

raw/articles/2026/05/桶排序

一句话总结

桶排序通过「分配元素到桶 → 对每个桶排序 → 合并有序桶」三步骤实现排序,是归并排序与计数排序的通用形式。

核心要点

1. 桶排序三步骤

  1. 分配:将待排序数组中的元素使用映射函数分配到若干个「桶」中
  2. 排序:对每个桶中的元素进行排序(可使用任意排序算法)
  3. 合并:将这些排好序的桶按顺序合并,得到最终排序结果

2. 桶排序与归并排序的联系

桶排序的思路类似归并排序:都是把大的数组分成小的数组进行排序,最后再合并。但桶排序更加灵活:

  • 归并排序是固定二分(k=2)
  • 桶排序可灵活决定桶的数量 k 和映射函数

3. 桶排序与计数排序的联系

当桶的数量 k 无限大,每个桶至多只有一个元素时,桶排序就转化成了计数排序,复杂度降低到 O(n)。

关系总结

桶排序 (通用形式)
  ├─ k=2 时 → 类似归并排序
  └─ k 足够大时 → 计数排序

4. 分开排序更高效(数学证明)

以选择排序为例:直接对大小为 n 的数组排序,时间复杂度 O(n²)。

若将数组分成 k 个桶,每个桶大小为 n₁, n₂, ..., nₖ(n = n₁ + n₂ + ... + nₖ),则:

  • 整体排序:n²
  • 分开排序:n₁² + n₂² + ... + nₖ²

几何直观:把 n² 想象成正方形面积,n₁² + n₂² + ... + nₖ² 是边上小正方形面积之和,显然小于整个正方形面积。

结论:分开排序的时间复杂度总和小于整体排序,这就是桶排序的数学基础。

基本原理

桶排序的核心问题

问题 说明
如何分配元素到桶? 需决定桶的数量 k,并设计映射函数
如何对每个桶排序? 可用任意排序算法,或递归使用桶排序
如何合并有序桶? 需 O(n) 时间合并,否则退化为其他排序

时间复杂度分析

桶数量 k 时间复杂度 对应算法
k = 1 O(n²) 退化为选择排序
1 < k < n < O(n²),接近 O(n) 典型桶排序
k = n(每桶最多1个元素) O(n) 计数排序

前提:合并操作需在 O(n) 时间内完成,否则总时间复杂度会增加。

相关概念

  • 计数排序:桶排序的特例,k 足够大时桶排序退化为计数排序
  • 归并排序:类似桶排序的分治思想,但固定二分
  • 选择排序:O(n²) 排序,用于数学证明对比
  • 堆排序:文章提及作为对比(合并操作不适用二叉堆)
  • 二叉堆:文章提及,但指出合并 k 个有序桶不适用二叉堆(O(n log k) 太慢)
  • 桶排序:

相关实体

相关题目

平台 题目 难度
LeetCode 912. Sort an Array 中等
力扣 912. 排序数组 中等

总结

桶排序是排序算法的「通用框架」:通过灵活选择桶数量 k 和映射函数,可以在归并排序(k=2)和计数排序(k=n)之间自由切换。其数学本质是「分而治之」——分开排序的总复杂度低于整体排序。


Interactive Graph