冒泡奇遇:从混乱到有序的华丽转身!
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小(或越大)的元素会经过交换慢慢“浮”到数列的顶端。
下面我将详细解释如何在PHP中实现冒泡排序算法。
PHP实现冒泡排序
首先,我们需要一个函数来执行冒泡排序。这个函数将接受一个数组作为输入,并返回排序后的数组。
function bubbleSort(&$array) { $n = count($array); // 外层循环控制比较的轮数 for ($i = 0; $i < $n - 1; $i++) { // 标志位,用于判断本轮是否有发生交换 $swapped = false; // 内层循环控制每一轮的比较和交换 for ($j = 0; $j < $n - 1 - $i; $j++) { // 如果前面的元素大于后面的元素,则交换它们 if ($array[$j] > $array[$j + 1]) { $temp = $array[$j]; $array[$j] = $array[$j + 1]; $array[$j + 1] = $temp; // 设置标志位为true,表示发生了交换 $swapped = true; } } // 如果没有发生交换,说明数组已经有序,提前退出 if (!$swapped) { break; } } } // 示例使用 $unsortedArray = [64, 34, 25, 12, 22, 11, 90]; bubbleSort($unsortedArray); print_r($unsortedArray);
代码解释
函数定义
function bubbleSort(&$array)
定义了一个名为bubbleSort
的函数,该函数接受一个引用参数$array
,这意味着函数内部对数组的任何修改都会反映到原数组上。获取数组长度
$n = count($array);
获取数组的长度。外层循环
for ($i = 0; $i < $n - 1; $i++)
控制比较的轮数。每一轮过后,最大的元素都会“冒泡”到数组的末尾,因此每完成一轮,需要比较的元素数量就减少一个。标志位
$swapped = false;
用来判断当前轮次是否发生了元素交换。如果没有发生交换,说明数组已经有序,可以提前退出循环,提高效率。内层循环
for ($j = 0; $j < $n - 1 - $i; $j++)
控制每一轮的比较和交换。$n - 1 - $i
确保每轮比较到当前未排序部分的末尾。比较和交换
if ($array[$j] > $array[$j + 1])
判断相邻两个元素的大小,如果前面的元素大于后面的元素,则交换它们的位置。提前退出
if (!$swapped) { break; }
如果某一轮没有发生交换,说明数组已经有序,可以提前退出外层循环。示例使用
定义一个未排序的数组$unsortedArray
,调用bubbleSort
函数对其进行排序,然后使用print_r
打印排序后的数组。
冒泡排序的时间复杂度
最坏情况
O(n^2),当输入数组是逆序时,需要进行n*(n-1)/2次比较和交换。最优情况
O(n),当输入数组已经有序时,只需进行一次遍历,没有发生交换,时间复杂度为O(n)。但由于我们通常需要处理的是无序数组,所以这种情况较少见。平均情况
O(n^2)。
冒泡排序是一种简单但效率较低的排序算法,适用于数据量较小或数据基本有序的情况。对于大数据集,建议使用更高效的排序算法,如快速排序、归并排序等。