zoukankan      html  css  js  c++  java
  • php排序算法

    (一)冒泡排序

    /**
     * 冒泡排序:
     * 使用相邻的元素挨个比较一次 符合条件交换位置
     * @param $arr
     */
    function bubbleSort($arr)
    {
        $length = count($arr);
    
        for ($i = 0; $i < $length - 1; $i++) { //控制轮数 length个数只需要比较length-1轮
            //控制每一轮的比较:并选出一个最大数
            //索引值应该是从0开始 --->到每一轮的倒数第二个结束 与其对应的后面一个元素进行比较
            //每一轮选出一个最大值以后 下一轮就少掉一个值 :
            //第一轮i=0,少0个;  j<arr.length-1-0
            //第二轮i=1,少1个;  j<arr.length-1-1
            //第三轮i=2,少2个   j<arr.length-1-2
            for ($j = 0; $j < $length - 1 - $i; $j++) {
                if ($arr[$j] > $arr[$j + 1]) {
                    $temp        = $arr[$j];
                    $arr[$j]     = $arr[$j + 1];
                    $arr[$j + 1] = $temp;
                }
            }
        }
        return $arr;
    }

    (二)选择排序

    /*
    选择排序)
    使用一个元素与其他元素挨个比较一次 如果符合条件则交换位置
    */
    function selectSort($arr)
    {
        $length = count($arr);
        //使用每个元素与其后面的所有元素挨个比较一次 符合条件则交换位置
        for ($i = 0; $i < $length - 1; $i++) {//被比较的数 从第一个到倒数第二个
            for ($j = $i + 1; $j < $length; $j++) {//要比较的其他所有数 从被比较的数后面一个开始 一直到最后一个数
                if ($arr[$i] > $arr[$j]) {
                    $temp    = $arr[$i];
                    $arr[$i] = $arr[$j];
                    $arr[$j] = $temp;
                }
            }
        }
        return $arr;
    }

     (三)快速排序

    /**
     * 快速排序
     * 通过设置一个初始中间值,来将需要排序的数组分成3部分,小于中间值的左边,中间值,大于中间值的右边,
     * 继续递归用相同的方式来排序左边和右边,最后合并数组
     * @param $arr
     * @return array
     */
    function quickSort($arr)
    {
        // 如果个数为空或者1,则原样返回数组
        if (count($arr) <= 1) {
            return $arr;
        }
    
        $middle = $arr[0]; // 初始中间值
    
        $left  = array(); // 接收小于中间值
        $right = array();// 接收大于中间值
    
        // 循环比较
        for ($i = 1; $i < count($arr); $i++) {
    
            if ($arr[$i] > $middle) {
    
                // 大于中间值
                $right[] = $arr[$i];
            } else {
    
                // 小于或等于中间值
                $left[] = $arr[$i];
            }
        }
    
        // 递归排序划分好的2边
        $left  = quickSort($left);
        $right = quickSort($right);
    
        // 合并排序后的数据,别忘了合并中间值
        return array_merge($left, array($middle), $right);
    }
  • 相关阅读:
    [CSP-S模拟测试]:reverse(模拟)
    BZOJ1559 [JSOI2009]密码 【AC自动机 + 状压dp】
    BZOJ2257 [Jsoi2009]瓶子和燃料 【裴蜀定理】
    BZOJ2729 [HNOI2012]排队 【高精 + 组合数学】
    BZOJ1857 [Scoi2010]传送带 【三分法】
    BZOJ2118 墨墨的等式 【最短路】
    BZOJ5340 [Ctsc2018]假面 【概率dp】
    BZOJ5343 [Ctsc2018]混合果汁 【二分 + 主席树】
    BZOJ4869 [Shoi2017]相逢是问候 【扩展欧拉定理 + 线段树】
    BZOJ2001 [Hnoi2010]City 城市建设 【CDQ分治 + kruskal】
  • 原文地址:https://www.cnblogs.com/jxl1996/p/10138888.html
Copyright © 2011-2022 走看看