昨天去酷狗面试的时候,在笔试那一关,有道要求用PHP实现冒泡排序的编程题,因为实在太久没用过冒泡排序,忘记了算法的原理,结果留了空白,实在无语。因此今天把PHP的冒泡排序代码记录一下:
<?php
/**
* 冒泡排序
* @param array $numbers 要排序的数组,只限数字一维数组
* @param boolean $asc 排序顺序,true是正序,false是逆序
*/
function bubble_sort(array $numbers, $asc = true) {
$n = count($numbers);
// 外循环最多排(n - 1)次
$out_loop_cnt = $n - 1;
for ($i = 0; $i < $out_loop_cnt; $i++) {
// 内循环最多排(n - i - 1)次
$in_loop_cnt = $n - $i - 1;
for ($j = 0; $j < $in_loop_cnt; $j++) {
// 根据排序顺序判断相邻两个数是否符合交换条件
$swap = $asc ? ($numbers[$j] > $numbers[$j + 1])
: ($numbers[$j] < $numbers[$j + 1]);
if ($swap) {
$temp = $numbers[$j + 1];
$numbers[$j + 1] = $numbers[$j];
$numbers[$j] = $temp;
}
}
}
return $numbers;
}
$arr = [1, 3, 5, 8, 4];
var_dump(bubble_sort($arr));
/**
* 输出:
* array (size=5)
* 0 => int 1
* 1 => int 3
* 2 => int 4
* 3 => int 5
* 4 => int 8
*/
var_dump(bubble_sort($arr, false));
/**
* 输出:
* array (size=5)
* 0 => int 8
* 1 => int 5
* 2 => int 4
* 3 => int 3
* 4 => int 1
*/