• php中的排序算法


    <?php
    /**
     * Created by PhpStorm.
     * User: leo
     * Date: 2017/11/6
     * Time: 21:05
     */
    $num = array(3,4,1,2,6,9,5,8);
    /**
     * @purpose 冒泡排序
     * @param array $value 待排序数组
     * @return array
     */
    function bubble($value = [])
    {
         $length = count($value) - 1;
        $value0 = array();
        //外循环
        for($j = 0;  $j < $length ; ++$j)
        {
            /**
             * @purpose 排序成功后减少无用搜索
             */
            if($value0 == $value)
            {
                return $value;
            }
            $value0 = $value;
            /**
             * @purpose 主要排序逻辑
             */
            //内循环
            for($i = 0;$i<$length; ++$i)
            {
                // 如果后一个值小于前一个值
                if($value[$i + 1] < $value[$i])
                {
                    $tmp = $value[$i + 1];
                    $value[$i+1] = $value[$i];
                    $value[$i] = $tmp;
                }
            }
            //echo $j."
    ";
    
            //var_dump($value);exit();
           // print_r($value);
           // echo '
    ';
        }
        return $value;
    }
    
    
    //$res =bubble($num);
    //print_r($res);
    
    /***
     * @purpose 快速排序
     * @param array $arr 待排序数组
     * @return array  排序后的数组
     *
     */
    function quick(array $arr)
    {
        //判断参数是否是一个数组
        if(!is_array($arr))
        {
            return [];
        }
        //如果数组长度是一直接返回
        $length = count($arr);
        if(1 >= $length)
        {
            return $arr;
        }
        //如果存在多个数组元素,则开始排序
        $left = $right = array();
        //使用for循环进行遍历,把第一个元素当做比较的对象
        for($i = 1 ; $i < $length;$i++)
        {
            //判断当前元素大小
            if($arr[$i] < $arr[0])
            {
                $left[] = $arr[$i];
            }
            else
            {
                $right[] = $arr[$i];
            }
        }
        //递归调用
        $left = quick($left);
        $right = quick($right);
        //将所有结果合并
        return array_merge($left,array($arr[0]),$right);
    }
    
    //$res = quick($num);
    //print_r($res);
    
    
    /**
     * @purpose 选择排序
     * @purpose array $arr 待排序数组
     * @return array
     */
    function select (array &$arr)
    {
        /**
         * @desc 不断的寻找最小值作为基准
         */
        $length = count($arr) - 1;
        for($i = 0 ; $i < $length; $i++)
        {
            $point = $i;//最小值索引
            for($j = $i+1; $j<= $length;$j++)
            {
                if($arr[$point] > $arr[$j])
                {
                    $point = $j;
                }
            }
            $tmp = $arr[$i];
            $arr[$i] = $arr[$point];
            $arr[$point] = $tmp;
    
        }
        return $arr;
    }
    //$res = select($num);
    //print_r($res);
    
    /**
     * @purpose 插入排序
     * @param array $arr
     * @return array
     */
    function insert($arr=array())
    {
        //区分 哪部分是已经排序好的
        //哪部分是没有排序的
          //找到其中一个需要排序的元素
          //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素
          //利用循环就可以标志出来
          //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,
        //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
        $length = count($arr);
        for($i = 1 ; $i< $length;$i++)
        {
            //获得当前需要比较的元素值。
            $base = $arr[$i];
            //内层循环控制 比较 并 插入
            for($j=$i - 1 ; $j >= 0; $j--)
            {
                //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
                if($base < $arr[$j])
                {
                    $arr[$j + 1] = $arr[$j] ;
                    //将前面的数设置为 当前需要交换的数
                    $arr[$j] = $base;
                }
                else
                {
                    //如果碰到不需要移动的元素
                    ////由于是已经排序好是数组,则前面的就不需要再次比较了。
                    break;
                }
    
            }
        }
        return $arr;
    }
    //$res2 = insert($num);
    //print_r($res2);
    
    /**
     * @purpose 默写插入排序
     */
    function insert2(Array $arr)
    {
        $length = count($arr) - 1;
        for($i = 1; $i< $length; $i++)
        {
            $base = $arr[$i];
            for($j = $i-1;0 < $j;$j--)
            {
                if($base < $arr[$j])
                {
                   $arr[$j+1] = $arr[$j];
                    $arr[$j] = $base;
                }
                else
                {
                    break;
                }
            }
            return $arr;
    
        }
    }
    
    
    
    $res2 = insert2([4,3,1]);
    print_r($res2);
    
    function select2(Array $arr)
    {
        $length = count($arr) - 1;
        for($i = 0 ; $i < $length;$i++)
        {
            $point = $i;
            for($j = $i+1;$j < $length ;$j++)
            {
                if($arr[$point] > $arr[$j])
                {
                    $point = $j;
                }
            }
    
            $tmp =  $arr[$i] ;
            $arr[$i] = $arr[$point];
            $arr[$point] = $tmp;
    
        }
        return $arr;
    }
    
    function quick2(Array $arr)
    {
        if(1 >= count($arr))
        {
            return $arr;
        }
        $left = $right =[];
        for($i = 1;$i < count($arr) -1 ; $i++)
        {
            if($arr[$i] < $arr[0])
            {
                $left[] = $arr[$i];
            }
            else
            {
                $right[] = $arr[$i];
            }
        }
        quick($left);
        quick($right);
        return array_merge($left,array($arr[0]),$right);
    }
    
    
    
  • 相关阅读:
    MySQL修改配置,区分大小写
    mvc中validateinput属性在asp.net4中不工作
    VS2010开发环境最佳字体及配色
    推荐19个很有用的 JavaScript 库
    Mysql limit 优化,百万至千万级快速分页,复合索引的引用并应用于轻量级框架
    C:\Windows\system32\MSVCR100.dll 没有被指定在 Windows 上运行,或者它包含错误。请尝试使用原始安装媒体重新安装程序,或联系您的系统管理员或软件供应商以获取支持。【解决办法】
    log4net配置步骤
    TraceSource记录程序日志
    [转] WPF TextBox控件中文字实现垂直居中
    SQL Server实现类似split功能
  • 原文地址:https://www.cnblogs.com/kite2356/p/7978429.html
Copyright © 2020-2023  润新知