当前位置:首页 > 开发笔记 > 正文内容

冒泡奇遇:从混乱到有序的华丽转身!

冒泡排序(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);

代码解释

  1. 函数定义
    function bubbleSort(&$array) 定义了一个名为 bubbleSort 的函数,该函数接受一个引用参数 $array,这意味着函数内部对数组的任何修改都会反映到原数组上。

  2. 获取数组长度
    $n = count($array); 获取数组的长度。

  3. 外层循环
    for ($i = 0; $i < $n - 1; $i++) 控制比较的轮数。每一轮过后,最大的元素都会“冒泡”到数组的末尾,因此每完成一轮,需要比较的元素数量就减少一个。

  4. 标志位
    $swapped = false; 用来判断当前轮次是否发生了元素交换。如果没有发生交换,说明数组已经有序,可以提前退出循环,提高效率。

  5. 内层循环
    for ($j = 0; $j < $n - 1 - $i; $j++) 控制每一轮的比较和交换。$n - 1 - $i 确保每轮比较到当前未排序部分的末尾。

  6. 比较和交换
    if ($array[$j] > $array[$j + 1]) 判断相邻两个元素的大小,如果前面的元素大于后面的元素,则交换它们的位置。

  7. 提前退出
    if (!$swapped) { break; } 如果某一轮没有发生交换,说明数组已经有序,可以提前退出外层循环。

  8. 示例使用
    定义一个未排序的数组 $unsortedArray,调用 bubbleSort 函数对其进行排序,然后使用 print_r 打印排序后的数组。

冒泡排序的时间复杂度

  • 最坏情况
    O(n^2),当输入数组是逆序时,需要进行n*(n-1)/2次比较和交换。

  • 最优情况
    O(n),当输入数组已经有序时,只需进行一次遍历,没有发生交换,时间复杂度为O(n)。但由于我们通常需要处理的是无序数组,所以这种情况较少见。

  • 平均情况
    O(n^2)。

冒泡排序是一种简单但效率较低的排序算法,适用于数据量较小或数据基本有序的情况。对于大数据集,建议使用更高效的排序算法,如快速排序、归并排序等。


返回列表

上一篇:使用PHP-redis操作Redis

没有最新的文章了...

“冒泡奇遇:从混乱到有序的华丽转身!” 的以下内容与本文无关

简单说两句

访客

◎ 不想说话可以不说,说了便要负责!