01-冒泡排序

1 基本思想

冒泡排序算法是重复地走访要排序的数列,一次比较相邻的两个元素,如果他们的顺序与排序要求相反,就将它们互换,直到没有再需要交换的数字,则说明排序完成。

2 算法过程

1、比较相邻的两个元素,如果前面的数大于后面的数,就将两个数进行交换;

2、从开始第一对到结尾的最后一对,对每一对相邻元素作第1)操作。这步做完后,最大的数就会沉到数组的最后。

3、然后再从头开始,重复第 1 和第 2 操作,直到倒数第二位时结束。

3 算法图解

冒泡排序算法示意图

4 PHP代码实现

/**
 * 冒泡排序: 循环n-1次, 每次使最大的往后面放, 交换相邻两元素
 * 时间复杂度: O(n2)
 * 空间复杂度: O(1)
 * 稳定排序
 */
function bubbleSort(&$arr) {

    $length = count($arr);

    for($i = 1; $i < $length; ++$i) { // 循环 $length - 1 次
        for($j = 0; $j < $length - $i ; ++$j) {// 每次使最大的放到最后
            if ($arr[$j + 1] < $arr[$j]) {// 交换相邻两元素
                list($arr[$j], $arr[$j + 1]) = [$arr[$j + 1], $arr[$j]];
            }
        }
    }
}

$arr = [38, 19, 29, 91, 85, 12, 41, 21];
bubbleSort($arr);
print_r($arr);

5 效率分析

1、时间复杂度:O(n²) 最好的情况:待排序记录按关键字从小到大排列(正序),需要比较n-1次,时间复杂度为O(n); 最坏的情况:待排序记录按关键字从大到小排列(逆序),需要比较n-1+n-2+…+1=n(n-1)/2,交换次数和比较次数等值,时间复杂度依然为O(n²)。 2、空间复杂度:O(1),是稳定排序

6 算法改进

TODO 设置标志变量$swapped


Last modified March 8, 2022: Fix image path (67fc7f5)