排序算法

  1. $arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];
  2. sort($arr); // 值由低到高
  3. rsort($arr); // 值由高到低
  4. asort($arr); // 键值关系保持值由低到高
  5. arsort($arr); // 键值关系保持值由高到低
  6. ksort($arr); // 键由低到高
  7. krsort($arr); // 键由高到低
  8. natsort($arr); // 值自然排序
  9. natcasesort($arr); // 大小写不敏感值自然排序
  10. shuffle($arr); // 值随机
  11. array_multisort($arr); // 键值关系保持值由低到高
  12. // 自定义排序
  13. $uFn = function ($a, $b) {
  14. if ($a === $b) {
  15. return 0;
  16. } else {
  17. return $a >= $b ? -1 : 1;
  18. }
  19. };
  20. usort($arr, $uFn);
  21. uasort($arr, $uFn);
  22. uksort($arr, $uFn);

冒泡排序

时间复杂度查找排序算法 - 图1

  1. $arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];
  2. $len = count($arr);
  3. for($i = 0; $i < $len - 1; $i++){ // 控制内层循环范围
  4. for($j = 0; $j < $len - 1 - $i; $j++){ // 先处理末位,依次往前排
  5. // 大的往后冒泡
  6. if ($arr[$j] > $arr[$j + 1]) {
  7. $tmp = $arr[$j];
  8. $arr[$j] = $arr[$j + 1];
  9. $arr[$j + 1] = $tmp;
  10. }
  11. }
  12. }
  13. print_r($arr);

选择排序

时间复杂度查找排序算法 - 图2

  1. $arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];
  2. $len = count($arr);
  3. for ($i = 0; $i < $len - 2; $i++) {
  4. $minPos = $i; // 先选定初始为最小值
  5. for ($j = $i + 1; $j < $len; $j++) { // 与之后的值依次比较
  6. // 遇到更小的,则更新为更小值
  7. if ($arr[$j] < $arr[$minPos]) {
  8. $minPos = $j;
  9. }
  10. }
  11. // 替换最小值与初始位置
  12. $tmp = $arr[$i];
  13. $arr[$i] = $arr[$minPos];
  14. $arr[$minPos] = $tmp;
  15. }
  16. print_r($arr);

查找算法

  1. $arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];
  2. in_array(1, $arr); // 查找数组中是否存在某数据
  3. array_search(3, $arr); // 查找给定数据,查到返回键值
  4. array_key_exists("key", $arr); // 键名/索引查找

二分查找

时间复杂度查找排序算法 - 图3

  1. $arr = [1, 8, 3, 6, 5, 4, 7, 2, 9];
  2. sort($arr); // 二分查找对象得是排好序的数组
  3. function binary_search(array $arr, int $val): int|bool
  4. {
  5. $len = count($arr);
  6. if ($val <= $arr[0] || $val >= $arr[$len - 1]) {
  7. if ($val === $arr[0]) { // 等于最小值
  8. return 0;
  9. } elseif ($val === $arr[$len - 1]) { // 等于最大值
  10. return $len - 1;
  11. } else {
  12. return false; // 超出范围
  13. }
  14. } else {
  15. $halfSub = round($len / 2);
  16. if ($val < $arr[$halfSub]) {
  17. return binary_search(array_slice($arr, 0, $halfSub), $val);
  18. } else {
  19. return binary_search(array_slice($arr, $halfSub, $len), $val);
  20. }
  21. }
  22. }
  23. print(binary_search($arr, 1));