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。