01-冒泡排序
less than a minute
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)