冒泡排序稳定、交换多、适合教学;选择排序不稳定、交换少、适合写入成本高的场景。二者比较次数均为o(n²),但冒泡可优化提前退出,选择则固定比较次数。

冒泡排序和选择排序都是 PHP 中最基础的排序算法,理解它们的差异,有助于在小规模数据或教学场景中合理选用,也能为后续学习更高效算法打下基础。
核心逻辑不同
冒泡排序像“水里冒泡”:反复扫描数组,每次比较相邻两个元素,把大的往后推、小的往前浮,一轮下来最大值就“浮”到末尾;下一轮再对剩余部分重复操作。
选择排序像“挑东西”:每轮从待排序部分中找出最小(或最大)值的索引,只做一次交换,把它放到当前起始位置。不关心相邻关系,也不频繁移动元素。
交换次数与效率差异
冒泡排序在最坏情况下(完全逆序)每轮都可能多次交换,总交换次数可达 O(n²) 级别;即使已有序,基础版本仍会完整遍历,不过加 $flag 优化后可提前退出。
选择排序每轮最多只交换一次,总共最多 n−1 次交换,交换开销更小;但比较次数固定为 n(n−1)/2,无法因数据接近有序而提速。
- 冒泡排序:比较多、交换多,适合教学演示或极小数组
- 选择排序:比较多、交换少,适合写入成本高(如某些硬件存储)的场景
稳定性表现不同
冒泡排序是稳定排序:相等元素不触发交换,相对位置不会改变。例如 [5, 8, 5, 2] 经冒泡后,前面的 5 仍保持在后面 5 的左侧。
选择排序是不稳定排序:一旦最小值出现在相等元素之后,交换就会破坏原有顺序。例如 [5, 8, 5, 2] 第一轮把 2 和首个 5 交换,两个 5 的先后关系就被打乱了。
代码实现风格对比
冒泡排序强调“相邻比较 + 即时交换”,内层循环常以 $j 控制边界,逻辑直觉强;
选择排序强调“先找再换”,内层只记录最小值下标 $minIndex,外层最后统一交换,结构更清晰、调试更方便。
两者时间复杂度都是 O(n²),空间复杂度都是 O(1),都不适合大数据量排序——真要处理万级数组,应优先考虑 快速排序 或 PHP 内置的 sort() 函数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











