冒泡排序

原理

从前往后依次将相邻的两个数进行比较,小的放前面,大的放后面,重复进行,直到没有再需要交换的数即排序完成。

过程(比如从小到大排序)

  1. 比较相邻的两个元素,将小的放前面,大的放后面。
  2. 从前往后依次对每一对相邻的元素做同样的操作,这样最后一个元素将会是最大的。
  3. 针对无需区间内的所有元素重复以上步骤。
  4. 重复步骤的元素依次减少,直到没有要交换的元素,即排序完成。

代码

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)。

稳定性

稳定,冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

适用场景

数据量小或部分数据已排序过的情况。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值