排序算法
$arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];sort($arr); // 值由低到高rsort($arr); // 值由高到低asort($arr); // 键值关系保持值由低到高arsort($arr); // 键值关系保持值由高到低ksort($arr); // 键由低到高krsort($arr); // 键由高到低natsort($arr); // 值自然排序natcasesort($arr); // 大小写不敏感值自然排序shuffle($arr); // 值随机array_multisort($arr); // 键值关系保持值由低到高// 自定义排序$uFn = function ($a, $b) {if ($a === $b) {return 0;} else {return $a >= $b ? -1 : 1;}};usort($arr, $uFn);uasort($arr, $uFn);uksort($arr, $uFn);
冒泡排序
时间复杂度。
$arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];$len = count($arr);for($i = 0; $i < $len - 1; $i++){ // 控制内层循环范围for($j = 0; $j < $len - 1 - $i; $j++){ // 先处理末位,依次往前排// 大的往后冒泡if ($arr[$j] > $arr[$j + 1]) {$tmp = $arr[$j];$arr[$j] = $arr[$j + 1];$arr[$j + 1] = $tmp;}}}print_r($arr);
选择排序
时间复杂度。
$arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];$len = count($arr);for ($i = 0; $i < $len - 2; $i++) {$minPos = $i; // 先选定初始为最小值for ($j = $i + 1; $j < $len; $j++) { // 与之后的值依次比较// 遇到更小的,则更新为更小值if ($arr[$j] < $arr[$minPos]) {$minPos = $j;}}// 替换最小值与初始位置$tmp = $arr[$i];$arr[$i] = $arr[$minPos];$arr[$minPos] = $tmp;}print_r($arr);
查找算法
$arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];in_array(1, $arr); // 查找数组中是否存在某数据array_search(3, $arr); // 查找给定数据,查到返回键值array_key_exists("key", $arr); // 键名/索引查找
二分查找
时间复杂度。
$arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];sort($arr); // 二分查找对象得是排好序的数组function binary_search(array $arr, int $val): int|bool{$len = count($arr);if ($val <= $arr[0] || $val >= $arr[$len - 1]) {if ($val === $arr[0]) { // 等于最小值return 0;} elseif ($val === $arr[$len - 1]) { // 等于最大值return $len - 1;} else {return false; // 超出范围}} else {$halfSub = round($len / 2);if ($val < $arr[$halfSub]) {return binary_search(array_slice($arr, 0, $halfSub), $val);} else {return binary_search(array_slice($arr, $halfSub, $len), $val);}}}print(binary_search($arr, 1));
