• 冒泡排序


    冒泡排序属于基本的排序算法,面试时候经常会被问到。今天来说点不一样的冒泡。

    思想

    - 分别比较左右相邻两个元素大小,若右边元素小于左边元素,则交换位置。

    基础版

    public function msort()
    {
        $array = [8,7,5,1,2,3];
    
        $len = count($array);
        $num = 0;
        for ($i = 0;$i < $len - 1;$i++){
            $num++;
            for ($j = 0;$j < $len - 1 - $i;$j++){
                if ($array[$j] > $array[$j+1]){
                    $tmp = $array[$j];
                    $array[$j] = $array[$j+1];
                    $array[$j+1] = $tmp;
                }
            }
            //echo $num;
            //print_r($array);
        }
    
        //echo '<pre>';
        //echo $num;
        print_r($array);
    }

    将调试打印的注释去掉运行下,你会发现:外层循环进行了5次,但是在第3次完成后,数组就是有序的了。后面几次循环是非必要的循环。

    是不眼前一亮?我们可以在数组已经有序的情况下,及时终止掉循环。

    小场面,直接上代码。

    进化版

    public function mSort()
    {
        $array = [8,7,5,1,2,3];
    
        $len = count($array);
        $num = 0;
        for ($i = 0;$i < $len - 1;$i++){
            $num++;
            //是否有序标识,默认为是
            $sortFlag = true;
            for ($j = 0;$j < $len - 1 - $i;$j++){
                if ($array[$j] > $array[$j+1]){
                    $tmp = $array[$j];
                    $array[$j] = $array[$j+1];
                    $array[$j+1] = $tmp;
                    //存在位置交换,非有序
                    $sortFlag = false;
                }
            }
            echo $num;
            print_r($array);
            if ($sortFlag){
                break;
            }
        }
    
        echo '<pre>';
        echo $num;
        print_r($array);
    }

    当数组有序时候,直接跳出最外层循环,运行代码可以看出,外层循环进行了4次,对咱们的优化迈出了一小步。

    既然外层循环可以减少循环次数,内层是不也一样呢?

    究极版本

    public function mSort()
    {
        $array = [3,4,2,1,5,6,7,8];
    
        $len = count($array) - 1;
        for ($i = 0;$i < count($array) - 1;$i++){
            //是否有序标识,默认为是
            $sortFlag = true;
            //内层循环停止节点
            $nLen = $len;
            $num = 0;
            for ($j = 0;$j < $nLen;$j++){
                //$num++;
                if ($array[$j] > $array[$j+1]){
                    $tmp = $array[$j];
                    $array[$j] = $array[$j+1];
                    $array[$j+1] = $tmp;
                    //存在位置交换,非有序
                    $sortFlag = false;
                    $len = $j;
                }
            }
            //echo $num;
            if ($sortFlag){
                break;
            }
        }
        print_r($array);
    }

    算法在一定基础上是依据数据的特殊性来不断尝试变更从而达到优化的效果的,使用示例来一步步验证,加油吧,骚年。

    好文章要分享: 

    漫画算法-小灰的算法之旅-排序算法(四)

  • 相关阅读:
    QTP 处理webtable中的数据
    Error 1406.Setup cannot write the value Microsoft
    QTP打开WinTree中的指定节点
    Excel数据操作
    VBS中实现函数多返回值
    QTP的回放模式
    VBS中运行应用程序的两种方式及WshShell对像浅析
    程序员奇葩面试的奇葩问题
    Android如何实现毛玻璃效果之Android高级模糊技术
    Android通过用代码画虚线椭圆边框背景来学习一下shape的用法
  • 原文地址:https://www.cnblogs.com/suojian/p/14282806.html
Copyright © 2020-2023  润新知