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