冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
在PHP中实现冒泡排序相对简单,下面将详细介绍如何在PHP中实现冒泡排序,并探讨一些提高其效率的方法。
基础冒泡排序
以下是一个基本的冒泡排序算法的PHP实现:
function bubbleSort($array) {
$size = count($array);
for ($i = 0; $i < $size - 1; $i++) {
for ($j = 0; $j < $size - $i - 1; $j++) {
if ($array[$j] > $array[$j + 1]) {
// 交换两个元素的位置
$temp = $array[$j];
$array[$j] = $array[$j + 1];
$array[$j + 1] = $temp;
}
}
}
return $array;
}
// 测试数组
$array = [, 34, 25, 12, 22, 11, 90];
// 执行排序
$sortedArray = bubbleSort($array);
// 打印排序后的数组
print_r($sortedArray);
这段代码定义了一个bubbleSort
函数,它接受一个数组作为参数,并返回一个排序后的数组。
提高冒泡排序的效率
冒泡排序的效率不是很高,其平均和最坏情况的时间复杂度都是O(n^2)。以下是一些提高冒泡排序效率的方法:
1. 提前终止
如果在一轮比较中没有发生任何交换,那么数组已经是排序好的。我们可以在冒泡排序中加入一个标志来检测这种情况,从而提前终止排序。
function improvedBubbleSort($array) {
$size = count($array);
for ($i = 0; $i < $size - 1; $i++) {
$swapped = false;
for ($j = 0; $j < $size - $i - 1; $j++) {
if ($array[$j] > $array[$j + 1]) {
$temp = $array[$j];
$array[$j] = $array[$j + 1];
$array[$j + 1] = $temp;
$swapped = true;
}
}
// 如果没有发生交换,数组已经排序完成
if (!$swapped) {
break;
}
}
return $array;
}
2. 记录最后一次交换位置
最后一次交换的位置之后的元素在下一轮排序中都是已经排序好的,因此我们可以将下一次遍历的范围缩小到最后一次交换的位置。
function moreImprovedBubbleSort($array) {
$size = count($array);
while ($size > 0) {
$lastSwapIndex = 0;
for ($i = 1; $i < $size; $i++) {
if ($array[$i - 1] > $array[$i]) {
$temp = $array[$i - 1];
$array[$i - 1] = $array[$i];
$array[$i] = $temp;
$lastSwapIndex = $i;
}
}
$size = $lastSwapIndex;
}
return $array;
}
通过这些改进,冒泡排序的效率可以得到一定的提升,尤其是在已经部分排序的数组上。
总结
冒泡排序是一种简单但效率较低的排序算法。在PHP中实现冒泡排序非常简单,但可以通过一些改进来提高其效率。了解这些技巧可以帮助你在需要时选择合适的排序算法。