原理
从前往后依次将相邻的两个数进行比较,小的放前面,大的放后面,重复进行,直到没有再需要交换的数即排序完成。
过程(比如从小到大排序)
- 比较相邻的两个元素,将小的放前面,大的放后面。
- 从前往后依次对每一对相邻的元素做同样的操作,这样最后一个元素将会是最大的。
- 针对无需区间内的所有元素重复以上步骤。
- 重复步骤的元素依次减少,直到没有要交换的元素,即排序完成。
代码
function bubble_sort($arr)
{
if(!is_array($arr)) {
return -1;
}
$len = count($arr);
//控制冒泡轮数
for($i = 0; $i < $len-1; $i++){
//控制每轮冒出一个最大的数
for($j = 0; $j < $len-1-$i; $j++){
if($arr[$j] > $arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
return $arr;
}
$arr = [1,3,2,4,6,5];
$res = bubble_sort($arr);
print_r($res);
时间复杂度
O(n^2),共需比较(n-1)(n-2)+...+3+2+1=n(n-1)/2次。如果本身已排序完成,那么只需比较n-1次即可,时间复杂度为O(n)。
空间复杂度
只需一个临时变量,占用一个内存空间,所以空间复杂度为O(1)。
稳定性
稳定,冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
适用场景
数据量小或部分数据已排序过的情况。