php 排序算法

1 篇文章 0 订阅
    /**
     * 快速排序
     * 循环遍历,定义一个标尺,让左边的不大于他,右边的不小于他
     * @param $arr
     * @return array
     */
    function quickSort($arr) {
        $length = count($arr);
        if ($length <= 1) {
            return $arr;
        }
        $base = $arr[0];
        $leftArr = [];
        $rightArr = [];
        for ($i = 1; $i < $length; $i++) {
            if ($arr[$i] < $base) {
                $leftArr[] = $arr[$i];
            } else {
                $rightArr[] = $arr[$i];
            }
        }
        $leftArr = $this->quickSort($leftArr);
        $rightArr = $this->quickSort($rightArr);
        return array_merge($leftArr, [$base], $rightArr);
    }


    /**
     * 冒泡排序
     * 逐个冒泡 出最大的值
     * @param $arr
     */
    function bubbleSort($arr) {
        $length = count($arr);

        //外层 循环多少次
        for ($i = 0; $i < $length - 1; $i++) {
            //内层求出每次的最大值
            for ($k = 0; $k < $length - $i - 1; $k++) {
                if ($arr[$k] > $arr[$k + 1]) {
                    $kValue = $arr[$k + 1];
                    $arr[$k + 1] = $arr[$k];
                    $arr[$k] = $kValue;
                }
            }
        }
        return $arr;
    }

    /**
     * 选择排序  将对应的值放到指定位置
     * @param $arr
     * @return mixed
     */
    function selectSort($arr) {
        // 获取长度
        $length = count($arr);
        //控制循环次数 和获取最小值
        for ($i = 0; $i < $length - 1; $i++) {
            // 假设最小值的位置
            $p = $i;

            // 使用假设的最小值和其他值比较,找到当前的最小值
            for ($j = $i + 1; $j < $length; $j++) {
                // $arr[$p] 是已知的当前最小值

                // 判断当前循环值和已知最小值的比较,当发下更小的值时记录下键,并进行下一次比较
                if ($arr[$p] > $arr[$j]) {
                    $p = $j; // 比假设的值更小
                }
            }

            // 通过内部for循环找到了当前最小值的key,并保存在$p中
            // 判断 日光当前$p 中的键和假设的最小值的键不一致增将其互换
            if ($p != $i) {
                $tmp = $arr[$p];
                $arr[$p] = $arr[$i];
                $arr[$i] = $tmp;
            }
        }
        // 返回最终结果
        return $arr;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值