鸡尾酒排序是冒泡排序的双向优化版本,每轮先从左到右上浮最大值、再从右到左下沉最小值,从而每次收缩未排序区间的首尾边界,加快收敛速度。

什么是鸡尾酒排序
鸡尾酒排序是冒泡排序的一种双向优化版本,也叫双向冒泡排序。它每次遍历都从左到右“上浮”最大元素,再从右到左“下沉”最小元素,这样每轮能同时确定首尾两个位置的正确元素,减少总比较轮数。
核心优化逻辑
传统冒泡每轮只能把一个最大值“冒”到末尾;鸡尾酒排序则用两个方向交替扫描:先正向扫描把当前未排序区的最大值移到右边界,再反向扫描把最小值移到左边界。这样未排序区间每次收缩两端,收敛更快。
- 设置左右边界 $left = 0 和 $right = count($arr) - 1
- 正向遍历:for ($i = $left; $i ,比较相邻元素,大者后移
- 完成一轮后,$right--(最大值已就位)
- 反向遍历:for ($i = $right; $i > $left; $i--),小者前移
- 完成一轮后,$left++(最小值已就位)
- 当 $left >= $right 时结束
PHP实现要点与剪枝优化
除了双向扫描,还可加入“无交换即终止”的提前退出机制,避免无效遍历:
- 每轮正向/反向扫描中设 $swapped = false
- 只要发生交换就置为 true,否则说明该区间已有序
- 若某轮正向和反向都未交换,直接 break
- 注意边界更新顺序:必须在完成对应方向扫描后才收缩边界,否则会漏判
时间与适用场景
最坏时间复杂度仍是 O(n²),但对部分有序(尤其是小元素集中在末尾、大元素在开头)的数据明显优于普通冒泡。平均表现更稳定,且原地排序、稳定、空间复杂度 O(1)。适合教学理解双向思想,或嵌入式等内存受限又需简单稳定排序的小数据场景。
立即学习“PHP免费学习笔记(深入)”;



















