数值越大,排的位置越高。数值越小,就会一直被换到最底部去。
不好说明。。换一种说法,当一个数组为 [1,0]
,0比1小吧?冒泡排序就会把0和1换个位置,使0(最小的)在最前面,1(最大的)在最后面。变成[0,1]
。
冒泡排序
/**
* 冒泡排序
*
* 注释的数据为第一轮循环
* @param array $arr 数组
* @return mixed
*/
function bubbling($arr) {
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) { // 从0开始的,所以减1,下标0-4共5个数字
for ($j = 0; $j < $len - $i - 1; $j++) { // 往下有解释 “-$i”
if ($arr[$j] > $arr[$j + 1]) { // 如果0下标的值大于1下标的值,不符合,所以往下看下一轮
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
}
}
}
return $arr;
}
$arr = [1, 4, 3, 5, 2];
var_dump(bubbling($arr));
第二轮循环,注释的为第二轮循环的说明
function bubbling($arr) {
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
for ($j = 0; $j < $len - $i - 1; $j++) {
if ($arr[$j] > $arr[$j + 1]) { // 如果下标1的值大于下标2的值,4>3
$temp = $arr[$j]; // 把下标1的值(4)赋值到临时存放的变量,免得下一步进行覆盖,丢失了
$arr[$j] = $arr[$j + 1]; // 将下标2的值(3)赋值到下标1的位置
$arr[$j + 1] = $temp; // 再把临时存放的下标1的值(4),移动到下标2的位置,实现换位
}
}
}
return $arr;
}
第二轮的结果为:$arr = [1, 3, 4, 5, 2];
第三轮循环因为下标2的值(4)不大于下标3的值(5),过
第四轮下标3的值(5)大于下标4的值(2),使它们互换位置,结果为:$arr = [1, 3, 4, 2, 5];
这也就是内层for循环的作用,它一路比对,进行换位。使1, 4, 3, 5, 2变成1, 3, 4, 2, 5
外层for循环+1,外层for执行第二次
第一轮循环,$arr = [1, 3, 4, 2, 5] 下标0的值(1)不大于下标1的值(3),过
第二轮循环,$arr = [1, 3, 4, 2, 5] 下标1的值(3)不大于下标2的值(4),过
第三轮循环,注释的为第三轮循环的说明
/**
* $arr = [1, 3, 4, 2, 5];
*/
function bubbling($arr) {
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) { // 此时$i为1
for ($j = 0; $j < $len - $i - 1; $j++) { // $len - $i,是因为上面的那些循环使最大的那个数字会一直往右移动,直到没有比它大的就停下,所以最后那个数字就是最大的,已经确定了的,就不需要再次比对
if ($arr[$j] > $arr[$j + 1]) { // 如果下标2的值(4)大于下标3的值(2)
$temp = $arr[$j]; // 把下标2的值(4)赋值到临时存放的变量,免得下一步进行覆盖,丢失了
$arr[$j] = $arr[$j + 1]; // 将下标3的值(2)赋值到下标2的位置
$arr[$j + 1] = $temp; // 再把临时存放的下标2的值(4),移动到下标3的位置,实现换位
}
}
}
return $arr;
}
第三轮结果为:$arr = [1, 3, 2, 4, 5]
因为上面已经$len - 1了,所以下标3和4不需要比对。
外层for循环+1,外层for执行第三次
第一轮循环,下标0的值(1)不大于下标1的值(3),过
第二轮循环,注释的为第二轮循环的说明
/**
* $arr = [1, 3, 2, 4, 5]
*/
function bubbling($arr) {
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) { // 此时$i为2
for ($j = 0; $j < $len - $i - 1; $j++) { // $len - 2,经过俩次外层for循环后,已经确定了最大值与第二的值
if ($arr[$j] > $arr[$j + 1]) { // 如果下标1的值(3)大于下标2的值(2)
$temp = $arr[$j]; // 把下标1的值(3)赋值到临时存放的变量,免得下一步进行覆盖,丢失了
$arr[$j] = $arr[$j + 1]; // 将下标2的值(2)赋值到下标1的位置
$arr[$j + 1] = $temp; // 再把临时存放的下标1的值(3),移动到下标2的位置,实现换位
}
}
}
return $arr;
}
第三轮循环结果为:$arr = [1, 2, 3, 4, 5]
继续会走外层for俩次。当然了,什么都不会被改变,因为已经得出结果了。