php 实现四大基础算法

冒泡

  • 时间复杂度O(N*N)
  • 具备稳定性
  • 思路
    • 外层循环控制轮数
    • 内存循环 比较大小 比前一个数字大 则交换
点击查看代码
   $len = count($arr);
    for ($i = 1; $i < $len; $i++) {
        for ($k = 0; $k < $len - $i; $k++) {
            if ($arr[$k] > $arr[$k + 1]) {
                list($arr[$k], $arr[$k + 1]) = array($arr[$k + 1], $arr[$k]);
            }
        }
    }

插入排序

  • 时间复杂度 O(N*N)
  • 具备稳定性
  • 思路:
    • 每次假设每次前一个已经时序
    • 外层控制轮数数 去除第一个
    • 内存在已经有序的序列中 比前一个小则交换
点击查看代码
$len = count($arr);
    for ($i = 1; $i < $len; $i++) {
        $tmp = $arr[$i];
        for ($k = $i - 1; $k >= 0; $k--) {
            if ($tmp < $arr[$k]) {
                $arr[$k + 1] = $arr[$k];
                $arr[$k] = $tmp;
            } else {
                break;
            }
        }
    }
选择排序
  • 时间复杂度 O(N*N)
  • 不具备稳定性 第一个选择最大值已经破坏了稳定性
  • 思路:
    • 每次选择一个最小数字 和前一个交换
    • 外层控制轮数
    • 内存每次去除一个最小数字 交换
点击查看代码
$len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) {
        $p = $i; 
        for ($k = $i + 1; $k < $len; $k++) {
            if ($arr[$p] > $arr[$k]) {
                $p = $k;
            }
        }

        if ($p != $i) {
            list($arr[$i], $arr[$p]) = array($arr[$p], $arr[$i]);
        }
    }

随机快排

  • 时间复杂度 O(N * logN)
  • 不具备稳定性
  • 思路
  • 每次 0 1 序列 左边小于基准值 右边大于基准值
  • 分区思想 然后左边有序 + 中间 + 右边有序
点击查看代码
$len = count($arr);
    if ($len <= 1) {
        return $arr;
    }


    $left = [];
    $right = [];
    for ($i = 1; $i < $len; $i++) {
        if ($arr[$i] < $arr[0]) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }

    quick_sort($left);
    quick_sort($right);

    return array_merge($left, [$arr[0]], $right);
posted @ 2022-10-31 17:05  vx_guanchaoguo0  阅读(12)  评论(0编辑  收藏  举报