双向冒泡排序(鸡尾酒排序)¶
概述¶
双向冒泡排序(Cocktail Sort),又称鸡尾酒排序、摇晃排序,是冒泡排序的一种改进变体。它**双向遍历数组,既从左到右冒泡最大值,又从右到左冒泡最小值**,在某些特定场景下比普通冒泡排序更高效。
核心特性
- 时间复杂度: 平均和最坏O(n²),最好O(n)
- 空间复杂度: O(1),原地排序
- 稳定排序: 相等元素保持相对顺序
- 冒泡排序改进: 双向冒泡减少排序轮数
算法形象比喻
想象摇晃一杯鸡尾酒:先向一个方向摇晃让大气泡浮到一端,再向相反方向摇晃让小气泡沉到另一端。双向冒泡排序就是这样的过程——双向交替冒泡,让最大值和最小值同时就位。
算法思想详解¶
核心思想¶
普通冒泡排序每轮只让一个最大值(或最小值)就位,而双向冒泡排序每轮可以让**最大值和最小值同时就位**:
graph TB
A["数组起始状态"] --> B["从左到右冒泡"]
B --> C["最大值到达右端"]
C --> D["从右到左冒泡"]
D --> E["最小值到达左端"]
E --> F{"已排序?"}
F -->|否| B
F -->|是| G["排序完成"]
style C fill:#E8F5E9,stroke:#4CAF50
style E fill:#E8F5E9,stroke:#4CAF50
style G fill:#E8F5E9,stroke:#4CAF50
双向遍历过程¶
算法可视化演示¶
完整排序过程对比¶
特殊场景优势¶
双向冒泡排序在某些特殊场景下优势明显:
基本实现¶
优化版本¶
记录最后交换位置¶
进一步优化:记录最后一次交换的位置,缩小下次遍历范围
添加提前退出检测¶
复杂度分析¶
时间复杂度¶
| 情况 | 时间复杂度 | 说明 |
|---|---|---|
| 最好 | O(n) | 数组已有序,一次遍历即可检测 |
| 平均 | O(n²) | 随机数据 |
| 最坏 | O(n²) | 逆序数组 |
| Text Only | |
|---|---|
空间复杂度¶
- 空间复杂度: O(1)
- 仅使用常数额外空间(left, right, swapped等变量)
稳定性¶
双向冒泡排序是**稳定排序**。
| Text Only | |
|---|---|
性能对比¶
与普通冒泡排序对比¶
| Text Only | |
|---|---|
特殊场景性能¶
| Text Only | |
|---|---|
应用场景¶
适合场景¶
- 两端都有极端值: 小值在右端,大值在左端
- 教学演示: 帮助理解冒泡排序的变体
- 小规模数据: n < 100时性能可接受
- 需要稳定排序: 保持相等元素顺序
不适合场景¶
- 大规模数据: O(n²)复杂度,性能差
- 随机数据: 与普通冒泡排序相比优势不明显
- 性能敏感场景: 应使用快速排序、归并排序等
变体算法¶
1. 奇偶排序(Odd-Even Sort)¶
交替进行奇数位置和偶数位置的冒泡:
2. 梳排序(Comb Sort)¶
使用递减间隔的双向冒泡:
与其他排序算法对比¶
| 算法 | 平均时间 | 最坏时间 | 空间 | 稳定性 | 特点 |
|---|---|---|---|---|---|
| 双向冒泡 | O(n²) | O(n²) | O(1) | 稳定 | 两端同时有序 |
| 冒泡排序 | O(n²) | O(n²) | O(1) | 稳定 | 实现简单 |
| 插入排序 | O(n²) | O(n²) | O(1) | 稳定 | 基本有序高效 |
| 选择排序 | O(n²) | O(n²) | O(1) | 不稳定 | 交换次数少 |
| 快速排序 | O(n log n) | O(n²) | O(log n) | 不稳定 | 实际最快 |
实际应用示例¶
教学演示¶
参考资料¶
- Knuth, D. E. (1998). "The Art of Computer Programming, Volume 3"
- 《算法导论》第2章
- Cocktail Shaker Sort - Wikipedia
- 双向冒泡排序可视化 - VisuAlgo