资讯专栏INFORMATION COLUMN

Laravel学习笔记之冒泡、快速、选择和插入排序(持续更新)

xingpingz / 2503人阅读

摘要:说明本文是对个人学习冒泡快速选择和插入排序的小总结。不管咋样,个人学习时有关索引就用到快速排序,索引也是以数据结构保存的存储引擎,所以基本功还是很重要的嘛。

说明:本文是对个人学习冒泡、快速、选择和插入排序的小总结。面试经常问这些东西,虽然不知道为啥老爱问这些,该问的又不问。不管咋样,个人学习MySQL时有关索引就用到快速排序,索引也是以B+Tree数据结构保存的(Innodb存储引擎),所以基本功还是很重要的嘛。

快速排序

个人实验发现,快速排序在这四个排序当中似乎是最快的,看下图比较直观:

看下代码吧:

arrayQuickSort($left);
        $right = $this->arrayQuickSort($right);

        return array_merge($left, [$mid], $right);
    }

}

$arr       = [5, 4, 5, 3, 8, 10, 3, 2, 4, 7];
$arr2      = array_rand(range(1, 1000), 500);
shuffle($arr2);

$quickSort = new QuickSort();

$time1     = microtime(true);
//$quickArr  = $quickSort->arrayQuickSort($arr);
$quickArr  = $quickSort->arrayQuickSort($arr2);//11.8780136108ms
$time2     = microtime(true);

//var_dump($quickArr);
echo (($time2 - $time1)*1000)."ms".PHP_EOL;

实验快速排序,排序随机的500个数只要11ms左右,还挺快。

冒泡排序

冒泡排序效率就比较差了,看图比较直观它的原理:

看代码吧:

 $data[$j+1]){
                    $this->swap($data[$j], $data[$j+1]);
                }
            }
        }

        return $data;
    }

    /**
     * 字符串排序也和数组一样,字符串数组形式访问字符
     * @param string|string $str
     * @return string
     */
    public function stringBubbleSort(string $str)
    {
        $count = strlen($str);
        for($i=0; $i<$count; $i++){
            for($j=0; $j<$count-1-$i; $j++){
                if($str[$j] > $str[$j+1]){
                    $this->swap($str[$j], $str[$j+1]);
                }
            }
        }

        return $str;
    }

    /**
     * 交换变量值
     * @param $var1
     * @param $var2
     */
    public function swap(&$var1, &$var2)
    {
        $tmp  = $var1;
        $var1 = $var2;
        $var2 = $tmp;
    }
}

$arr   = [5, 4, 5, 3, 8, 10, 3, 2, 4, 7];
$str   = "SegmentFault";
$arr2  = array_rand(range(1, 1000), 500);
shuffle($arr2);

$sort  = new BubbleSort();

$time1 = microtime(true);
//$bubbleArr = $sort->arrayBubbleSort($arr);
$bubbleArr = $sort->arrayBubbleSort($arr2);//316.018104553ms
$time2 = microtime(true);

//var_dump($bubbleArr);
echo (($time2 - $time1)*1000)."ms".PHP_EOL;

实验冒泡排序,排序随机的500个数需要316ms左右,慢的不行。

插入排序

插入排序个人觉得就像是玩扑克,牌桌上n张牌,一张张抓过来,然后新牌根据手上的m张牌依次比较,找到对应位置。看图比较直观:

看代码吧:

0; $j--){
                if($data[$j] > $data[$j-1]){
                    break;
                }
                $this->swap($data[$j-1], $data[$j]);
            }
        }

        return $data;
    }

    /**
     * 交换变量值
     * @param $var1
     * @param $var2
     */
    public function swap(&$var1, &$var2)
    {
        $tmp  = $var1;
        $var1 = $var2;
        $var2 = $tmp;
    }

}

$arr       = [5, 4, 5, 3, 8, 10, 3, 2, 4, 7];
$arr2      = array_rand(range(1, 1000), 500);
shuffle($arr2);
$insert    = new InsertSort();

$time1     = microtime(true);
//$insertArr = $insert->arrayInsertSort($arr);
$insertArr = $insert->arrayInsertSort($arr2);//315.321922302ms
$time2     = microtime(true);

//var_dump($insertArr);
echo (($time2 - $time1)*1000)."ms".PHP_EOL;



include __DIR__ . "/autoload.php";

function inverst_sort(string $str): string {
    for ($i = 1; $i < strlen($str); $i++) {
        $key = $str[$i];
        $j   = $i - 1;
        
        while ($j > 0 && $str[$j] > $key) {
            $str[$j+1] = $str[$j];
            $j         = $j -1;
        }
        
        $str[$j+1] = $key;
    }
    
    return $str;
}

dump(inverst_sort("abdghhjc"));

实验插入排序,排序随机的500个数需要315ms左右,和冒泡排序差不多速度。

选择排序

选择排序速度还行,看图:

看代码吧:

 $data[$j]){
                    $min = $j;
                }
            }
            
            if($min != $i){
                $this->swap($data[$min], $data[$i]);
            }
        }

        return $data;
    }

    /**
     * 交换变量值
     * @param $var1
     * @param $var2
     */
    public function swap(&$var1, &$var2)
    {
        $tmp  = $var1;
        $var1 = $var2;
        $var2 = $tmp;
    }

}

$arr2      = array_rand(range(1, 1000), 500);
shuffle($arr2);
$arr       = [5, 4, 5, 3, 8, 10, 3, 2, 4, 7];

$select    = new SelectSort();

$time1     = microtime(true);
//$selectArr = $select->arraySelectSort($arr);
$selectArr = $select->arraySelectSort($arr2);//44.0230369568ms
$time2 = microtime(true);

//var_dump($selectArr);
echo (($time2 - $time1)*1000)."ms".PHP_EOL;

实验选择排序,排序随机的500个数需要44ms左右,速度还行。

总结:排序和查找是永恒主题。扎实下基本功,会继续学习相关排序和查找算法,到时见。

欢迎关注Laravel-China。

RightCapital招聘Laravel DevOps

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21701.html

相关文章

  • 如何"有计划,高效率,优简历"应对面试

    摘要:虽然有了十全的计划,但如何高效率去记住上面那么多东西是一个大问题,看看我是怎么做的。 前言 前一篇文章讲述了我在三月份毫无准备就去面试的后果,一开始心态真的爆炸,但是又不服气,一想到每次回来后家人朋友问我面试结果的期待脸,越觉得必须付出的行动来证明自己了。 面经传送门:一个1年工作经验的PHP程序员是如何被面试官虐的? 下面是我花费两个星期做的准备,主要分三部分: 有计划——计划好...

    gyl_coder 评论0 收藏0
  • 前端需要知道的数据结构与算法(持续更新中...)

    摘要:通常需要在实际的计算机运行才知道具体的执行时间。算法的执行时间往往和算法代码中语句执行的数量有关。空间复杂度运行一段程序的内存占用,空间复杂度通常指的是算法程序在计算机只想中只想所需要的存储空间。 基本数据结构 JS 数据类型 基本类型(栈 stack): Number String Boolean Null Undefined 和 Symbol(es6 新增)引用类型(堆 heap)...

    Jensen 评论0 收藏0
  • JavaScript学习笔记 - 基础排序算法

    摘要:本文记录了我在学习前端上的笔记,方便以后的复习和巩固。冒泡排序算法步骤比较相邻的元素。这步做完后,最后的元素会是最大的数。重复第二步,直到所有元素均排序完毕。得到序列第二趟,,和进行交换。 本文记录了我在学习前端上的笔记,方便以后的复习和巩固。推荐大家去看看这一本gitBook上的书十大经典排序算法本文就是看这本书记录的笔记。 冒泡排序 1.算法步骤 1.比较相邻的元素。如果第一个比第...

    mindwind 评论0 收藏0

发表评论

0条评论

xingpingz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<