是的,PHP中实现的冒泡排序在处理重复元素时保持稳定性,因其仅在相邻元素严格大于时交换,相等时不交换,从而保证相同值的相对顺序不变。

是的,PHP中实现的冒泡排序在处理重复元素时保持稳定性。
稳定性指的是:当两个元素的值相等时,它们在排序后的相对位置与原始数组中的一致。冒泡排序天然满足这一特性,原因很直接——它只在严格大于(或小于)时才交换相邻元素,相等时不交换。
比如数组 [3, 1, 2, 1] 中有两个 1,假设它们分别位于索引1和索引3(即第2个和第4个位置)。在整个排序过程中,只要比较到 1 == 1,就不会触发交换;而其他更大或更小的数在“冒泡”过程中会绕过它们、不会打乱这两个 1 的先后次序。
冒泡排序稳定的关键机制
- 比较操作始终限定在相邻元素之间
- 交换条件严格为
if ($a > $b)(升序)或if ($a < $b)(降序),不包含>=或<= - 相等元素不会被强制调换位置,原有顺序自然保留
PHP代码示例验证
function bubbleSort(&$arr) {
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
for ($j = 0; $j < $n - 1 - $i; $j++) {
if ($arr[$j] > $arr[$j + 1]) { // 注意:仅用 >,不用 >=
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
}
}
}
}
// 带标识的重复值(用字符串辅助观察顺序)
$data = ['a' => 5, 'b' => 3, 'c' => 5, 'd' => 1];
// 提取值并记录原始键顺序:[5(a), 3(b), 5(c), 1(d)]
$values = array_values($data); // [5,3,5,1]
bubbleSort($values); // 排序后:[1,3,5,5]
// 两个5仍保持 a 在 c 前的相对关系(因未交换相等项)和PHP内置函数对比更清楚
-
arsort()、krsort()等底层用的是快速排序变种,不稳定,相同值的键顺序可能乱 - 手写冒泡排序则可控、透明,只要逻辑不破坏“相等不交换”原则,就稳如磐石
注意:稳定性依赖于具体实现。若误写成 >= 或混入其他交换逻辑,就可能失稳。
立即学习“PHP免费学习笔记(深入)”;



















