原理:冒泡算法就是将较小的元素搬移到数组的开始,将较大的元素慢慢地往数组的尾部移动,小的数据就像气泡一下往上冒,而大的数据就像石头一样往下沉。
总结出两个方法,分别是「递归」、「双层for循环」实现:
「双增for循环」:for()方法内传入一个数组,对数组进行循环n-1次,并判断,两两比较,前值是否大于后值,如果是则交换。依次再次进行循环数组n-1次,最后返回有序的数组。
$arr = [1, 2, 4, 1, 23, 22, 12, 54, 65, 23];
function maopao($arr)
{
$len = count($arr);
// 该层循环控制 需要冒泡的轮数
for ($i = 1; $i < $len; $i++) {
// 该层循环用来控制每轮冒出一个数 需要比较的次数
for ($k = 0; $k < $len - $i; $k++) {
if ($arr[$k] > $arr[$k + 1]) {
$tmp = $arr[$k + 1]; // 声明一个临时变量
$arr[$k + 1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $arr;
}
「递归」:原理其实和双增for循环一致
/** * @param $arr 传入要排序的数组 * @param int $index 循环次数 * @return mixed */ function maopao1($arr, $index = 0) { $len = count($arr); if ($len < $index) { return $arr; } for ($i = $index; $i < ($len - 1); $i++) { if ($arr[$i] > $arr[$i + 1]) { $tmp = $arr[$i + 1]; $arr[$i] = $tmp; $arr[$i + 1] = $arr[$i]; } } $index++; return maopao1($arr, $index); }
//array(10) {
// [0]=>
// int(1)
// [1]=>
// int(1)
// [2]=>
// int(2)
// [3]=>
// int(4)
// [4]=>
// int(12)
// [5]=>
// int(22)
// [6]=>
// int(23)
// [7]=>
// int(23)
// [8]=>
// int(54)
// [9]=>
// int(65)
//}