PHP实现冒泡算法

PHP实现冒泡算法

给出一组互不相同的数字,然后按照从小到大的顺序排列

基本思路: 从索引为0的数字开始,和索引为1的数字比较,如果前者比后者大,则相互交换位置,接着索引为1的数字和索引为2的数字比较,以此类推。 当索引为最大的数字和它之前的数字比较之后,则一个循环结束。 在从索引为0开始重复上面的步骤,直到不产生任何位置互换,然后输出排序完成后的数组。

实例分析

以数组 arr = [5, 1, 4, 2, 8] 为例说明,加粗的数字表示每次循环要比较的两个数字:

第一次外循环

( 5 1 4 2 8 ) → ( 1 5 4 2 8 ), 5 > 1 交换位置 ( 1 5 4 2 8 ) → ( 1 4 5 2 8 ), 5 > 4 交换位置 ( 1 4 5 2 8 ) → ( 1 4 2 5 8 ), 5 > 2 交换位置 ( 1 4 2 5 8 ) → ( 1 4 2 5 8 ), 5 < 8 位置不变

第二次外循环(除开最后一个元素8,对剩余的序列)

( 1 4 2 5 8 ) → ( 1 4 2 5 8 ), 1 < 4 位置不变 ( 1 4 2 5 8 ) → ( 1 2 4 5 8 ), 4 > 2 交换位置 ( 1 2 4 5 8 ) → ( 1 2 4 5 8 ), 4 < 5 位置不变

第三次外循环(除开已经排序好的最后两个元素,可以注意到上面的数组其实已经排序完成,但是程序本身并不知道,所以还要进行后续的循环,直到剩余的序列为 1)

( 1 2 4 5 8 ) → ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) → ( 1 2 4 5 8 )

第四次外循环(最后一次) ( 1 2 4 5 8 ) → ( 1 2 4 5 8 )

这个例子主要是展开分析下步骤,演示代码不使用这个示例 上面的例子来源:http://bubkoo.com/2014/01/12/sort-algorithm/bubble-sort/

PHP代码实现

$arr = [4,9,8,6,7,3,1,2];

function bubbleSort($arr){
    $items = count($arr);
    $checkPoint = true;
    while($checkPoint){
        $checkPoint = false;
        for($i=0;$i<$items-1;$i++){
            if($arr[$i]>$arr[$i+1]){
                $tmp = $arr[$i];
                $arr[$i] = $arr[$i+1];
                $arr[$i+1] = $tmp;
                $checkPoint = true;
            }
        }
    }
    return $arr;
}
echo '<pre>';
print_r(bubbleSort($arr));

这里的一个重点是不产生任何交换就意味着排序已经完成,如果以此为条件停止循环是关键。

上面的代码中,创建一个$checkPoint变量,将它设置为false,如果有交换产生则将它赋值为true,没有交换产生了就是默认的false,那么循环结束。 为了使while循环能启动,在这之前先将$checkPoint赋值为true