php冒泡排序

思路就是一组一组数字(相邻的两个数)比较,如果大于后面的数字就发生交换,这样比较完的结果就是会把最大的数移动到最后的位置。

$numbers = array(-2, 5, 3, 1, -3, -4);

for ($i = 0; $i < count($numbers)-1; $i++) {

    for ($j = 0; $j < count($numbers) - $i - 1; $j++) {

        if ($numbers[$j] > $numbers[$j + 1]) {

            $temp = $numbers[$j];

            $numbers[$j] = $numbers[$j + 1];

            $numbers[$j + 1] = $temp;

        }

    }

    var_dump($numbers);

}

第一轮交换完过程就是: -2不大于5不交换,5大于3交换,5大于1交换,5大于-3交换,5大约-4交换....

结果: [-2, 3, 1, -3, -4,5]

...

第二轮交换的时候,注意条件$j < count($numbers) - $i - 1; 已经不跟最后一个比较了,因为你懂的...


关于优化

如果数组是: [5,1,2,3,4] 套用我们第二种思路的话, 是不是我们第一轮循环完(结果是[1,2,3,4,5]), 就可以终止循环了.

加个变量,如果里面没有发生交换,就意味着数组目前就是有序的,可以退出循环了

$numbers = [5,1,2,3,4];

for ($i = 0; $i < count($numbers)-1; $i++) {

    $flag = 1;

    for ($j = 0; $j < count($numbers) - $i - 1; $j++) {

        if ($numbers[$j] > $numbers[$j + 1]) {

            $flag = 0;

            $temp = $numbers[$j];

            $numbers[$j] = $numbers[$j + 1];

            $numbers[$j + 1] = $temp;

        }

    }

    if($flag) break;

}

var_dump($numbers);exit;

你可能感兴趣的:(php冒泡排序)