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

快速排序

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

看下代码吧:

<?php
/*** Created by PhpStorm.* User: liuxiang* Date: 16/6/15* Time: 21:33*/class QuickSort{/*** 递归** 快速排序过程:* 1.给初始值,$mid=$data[0]* 2.第二个值开始,与$mid比较,小的放在左边,大的放在右边* 3.递归,直到数组就剩一个值** 效率低,还使用了array_merge()方法** @param array $data* @return array*/public function arrayQuickSort(array $data){$count = count($data);if($count <= 1){return $data;}$mid   = $data[0];$left  = $right = [];for($i=1; $i<$count; $i++){($data[$i] < $mid) ? $left[] = $data[$i] :$right[]=$data[$i];}$left  = $this->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左右,还挺快。

冒泡排序

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

看代码吧:

<?php
/*** Created by PhpStorm.* User: liuxiang* Date: 16/6/15* Time: 21:26*/
class BubbleSort{/*** 非递归** 冒泡排序算法过程:* 1.比较相连两个元素,如果第一个比第二个大,交换位置* 2.n个数,需要观察n-1次* 3.每一个数number,需要与其余n-1个数比较,但实际只需要排序n-1-$i,如5,4,3,2,1就5经过4=5-1-0次排序4,3,2,1,5,而4只经过3=5-1-1次排序3,2,1,4,5* 4.直到排序次数走完,一个乱序就可排为升序或降序了* 平均时间复杂度最优n,最差n^2*//*** @param array $data* @return array*/public function arrayBubbleSort(array $data){$count = count($data);for($i=0; $i<$count; $i++){for($j=0; $j<$count-1-$i; $j++){
//        for($j=0; $j<$count-1; $j++){//这样也可以,不过多了$i次比较if($data[$j] > $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张牌依次比较,找到对应位置。看图比较直观:

看代码吧:

<?php/*** Created by PhpStorm.* User: liuxiang* Date: 16/6/23* Time: 18:14*/
class InsertSort
{/*** 插入排序具体算法描述* 1.从第一个元素开始,该元素可以认为已经被排序* 2.取出下一个元素,在已经排序的元素序列中从后向前扫描* 3.如果该元素(已排序)大于新元素,将该元素移到下一位置* 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置* 5.将新元素插入到该位置后* 6.重复步骤2~5** @param array $data* @return array*/public function arrayInsertSort(array $data){$count = count($data);for($i=0; $i<$count-1; $i++){for($j=$i+1; $j>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左右,和冒泡排序差不多速度。

选择排序

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

看代码吧:

<?php/*** Created by PhpStorm.* User: liuxiang* Date: 16/6/23* Time: 17:50*/
class SelectSort
{/*** 1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置* 2.再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾* 3.以此类推,直到所有元素均排序完毕** @param array $data* @return array*/public function arraySelectSort(array $data){$count = count($data);for($i=0; $i<$count - 1; $i++){$min = $i;for($j=$i+1; $j<$count; $j++){if($data[$min] > $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

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

  1. PFC2D学习笔记—— 命令的理解与技巧(持续更新)

    [备注:]以下理解与翻译不足的肯请各位学者批评指正,谢谢! ------------------------------------------------------------------ cyc ...

  2. Bootstrap学习笔记01【快速入门、栅格布局】

    Java后端 学习路线 笔记汇总表[黑马程序员] Bootstrap学习笔记01[快速入门.栅格布局][day01] Bootstrap学习笔记02[全局CSS样式.组件和插件.案例_黑马旅游网][d ...

  3. 正则表达式学习笔记009--大括号与选择符的认识与应用

    正则表达式学习笔记009--大括号与选择符的认识与应用 交流群1:251572072 交流群2:170933152 |  选择符 {n}前面的元素字符出现了n次 {n,}前面的元素字符最少出现n次,n ...

  4. 深度学习笔记:01快速构建一个手写数字识别系统以及张量的概念

    深度学习笔记:01快速构建一个手写数字识别系统 神经网络代码最好运行在GPU中,但是对于初学者来说运行在GPU上成本太高了,所以先运行在CPU中,就是慢一些. 一.安装keras框架 使用管理员模式打 ...

  5. Laravel学习笔记汇总——Collection方法详解

    ## Laravel学习笔记汇总--Collection方法详解 本文参考:https:// laravel.com/docs/8.x/collections // 返回整个底层的数组 collect ...

  6. 回炉篇5—数据结构(4)之冒泡、选择、插入排序算法

    冒泡.选择.插入排序算法 排序大家都很熟了,很古老的算法,古老才有必要回炉再看一遍,经典才值得研究. 1.冒泡排序 从字面意思理解,水泡从水底冒出到水面的过程中,由小慢慢大,最后大泡泡冒出水面,了解这 ...

  7. 面试必备:深入了解冒泡、选择和插入排序的优缺点

    前言 相信排序对于每一个程序员来说都不会陌生,很可能你学的第一个算法就是排序,尤其冒泡排序大家可能都是信手拈来,但是当从学校走入了职场之后,这些经典的排序已经慢慢淡出了我们的视线,因为在日常开发中,高 ...

  8. pwn学习总结(二) —— 基础知识(持续更新)

    pwn学习总结(二) -- 基础知识(持续更新) Canary PLT表&GOT表 格式化字符串漏洞 GCC编译参数 ASLR 危险函数 输入流 syscall条件 shellcode 其它 ...

  9. MySQL笔记:B站康师傅天花板教程(持续更新)

    MySQL笔记:B站康师傅天花板教程(持续更新)

最新文章

  1. pandas使用groupby函数和describe函数计算不同分组的描述性统计(descriptive statistics of each group in dataframe)
  2. 【uniapp】 下拉刷新页面
  3. android 自定义 进度条 旋转,Android_Android ProgressBar进度条使用详解,ProgressBar进度条,分为旋转进 - phpStudy...
  4. 数据结构与算法 | 堆
  5. case计算机英语,计算机英语常用术语
  6. 得到python对象的真实大小
  7. 消息通知系统模型设计
  8. AMP (LAMP/WAMP)
  9. python文件下载学习
  10. APP开发接口分类介绍
  11. python pandas 格式化qcc数据【最后保存csv文件】
  12. 电子面单平台JAVA对接方案
  13. el-table 样式自定义
  14. 格式化后如何修复损坏的JPEG文件?
  15. matlab仿真冲激响应函数,无限冲激响应数字滤波器的设计与MATLAB仿真
  16. 非递归式查找树形数据
  17. 只有失去的时候,才知道它的珍贵,QQ成为不明真相的群众发泄怒火的最大牺牲品...
  18. 天龙八部新目标服务器未响应,新天龙八部怀旧服有多火?4个月后开新服,玩家排队5小时没进去...
  19. Python StringIO与cStringIO
  20. FCPX插件:56种高动态HDR视频调色预设HDR Look Effects

热门文章

  1. Ubuntu 16.04安装Caffe的记录及FCN官方代码的配置
  2. 【分享】学长的安利来了~~O(∩_∩)O
  3. Android 一个页面上下两个ListView的页面显示
  4. Android无界面编程之使用Service
  5. Django实战(10):单元测试
  6. ArcEngine中打开各种数据源(WorkSpace)的连接
  7. Automatic Brain Tumor Segmentation using Cascaded Anisotropic Convolutional Neural Networks
  8. 张正友标定算法理论及算法实现
  9. ajax通用代码,通用代码之一: 轻松使用Ajax
  10. layui select第一次无法选中_Windows 10 无法访问共享的解决办法大全