ZetCode

PHP 冒泡排序算法

最后修改于 2025 年 4 月 16 日

基本定义

算法 是一种逐步解决问题或执行计算的程序。在编程中,算法被实现为函数或方法。

排序是将数据按特定顺序排列,通常是升序或降序。 有效的排序对于优化需要排序输入的其他算法至关重要。

常见的排序算法包括

气泡排序算法

冒泡排序是一种简单的基于比较的算法。 它重复遍历列表,比较相邻的元素,如果它们的顺序错误则交换它们。

该算法得名于较小的元素“冒泡”到列表的顶部。 它的时间复杂度为 O(n²),这使得它对于大型数据集效率低下。

基本冒泡排序实现

这是 PHP 中用于数值数据的冒泡排序的基本实现

bubble_sort.php
<?php

function bubbleSort(array $arr): array {
    $n = count($arr);
    
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                // Swap elements
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }
    
    return $arr;
}

$numbers = [64, 34, 25, 12, 22, 11, 90];
$sorted = bubbleSort($numbers);

print_r($sorted);
// Output: Array ( [0] => 11 [1] => 12 [2] => 22 [3] => 25 [4] => 34 [5] => 64 [6] => 90 )

优化后的冒泡排序

我们可以通过添加一个标志来优化冒泡排序,以检查一次遍历中是否进行了任何交换。 如果没有交换发生,则该数组已排序。

optimized_bubble.php
<?php

function optimizedBubbleSort(array $arr): array {
    $n = count($arr);
    
    for ($i = 0; $i < $n - 1; $i++) {
        $swapped = false;
        
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                // Swap elements
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
                $swapped = true;
            }
        }
        
        // If no swaps, array is sorted
        if (!$swapped) break;
    }
    
    return $arr;
}

$numbers = [5, 1, 4, 2, 8];
$sorted = optimizedBubbleSort($numbers);

print_r($sorted);
// Output: Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 [4] => 8 )

降序排序

要以降序排序,我们只需反转比较条件。

descending_bubble.php
<?php

function bubbleSortDesc(array $arr): array {
    $n = count($arr);
    
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if ($arr[$j] < $arr[$j + 1]) {  // Changed comparison operator
                // Swap elements
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }
    
    return $arr;
}

$numbers = [64, 34, 25, 12, 22, 11, 90];
$sorted = bubbleSortDesc($numbers);

print_r($sorted);
// Output: Array ( [0] => 90 [1] => 64 [2] => 34 [3] => 25 [4] => 22 [5] => 12 [6] => 11 )

对文本数据进行排序

冒泡排序还可以通过使用 strcmp 函数比较字符串来按字母顺序对字符串进行排序。

text_bubble.php
<?php

function bubbleSortText(array $arr): array {
    $n = count($arr);
    
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if (strcmp($arr[$j], $arr[$j + 1]) > 0) {
                // Swap elements
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }
    
    return $arr;
}

$names = ["John", "Alice", "Bob", "Eve", "David"];
$sorted = bubbleSortText($names);

print_r($sorted);
// Output: Array ( [0] => Alice [1] => Bob [2] => David [3] => Eve [4] => John )

冒泡排序与快速排序基准测试

让我们将冒泡排序与更有效的快速排序算法进行比较。 我们将测量对大型数组进行排序的执行时间。

sort_benchmark.php
<?php

function bubbleSort(array $arr): array {
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }
    return $arr;
}

function quickSort(array $arr): array {
    if (count($arr) <= 1) return $arr;
    
    $pivot = $arr[0];
    $left = $right = [];
    
    for ($i = 1; $i < count($arr); $i++) {
        if ($arr[$i] < $pivot) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }
    
    return array_merge(quickSort($left), [$pivot], quickSort($right));
}

// Generate large array
$largeArray = range(1, 2000);
shuffle($largeArray);

// Benchmark Bubble Sort
$start = microtime(true);
bubbleSort($largeArray);
$bubbleTime = microtime(true) - $start;

// Benchmark Quick Sort
$start = microtime(true);
quickSort($largeArray);
$quickTime = microtime(true) - $start;

printf("Bubble Sort time: %.4f seconds\n", $bubbleTime);
printf("Quick Sort time: %.4f seconds\n", $quickTime);

// Typical output:
// Bubble Sort time: 1.2345 seconds
// Quick Sort time: 0.0123 seconds

基准测试清楚地表明了快速排序对于大型数据集的卓越性能。 冒泡排序的 O(n²) 复杂度使其不适用于大型数组,而快速排序的 O(n log n) 表现更好。

何时使用冒泡排序

尽管效率不高,但冒泡排序有一些用例

来源

PHP 排序函数

本教程涵盖了 PHP 中的冒泡排序算法,并提供了数值和文本数据的示例,包括性能比较。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 PHP 教程