PHP快速排序算法实现的原理及代码详解


Posted in PHP onApril 03, 2019

算法原理

下列动图来自五分钟学算法,演示了快速排序算法的原理和步骤。

PHP快速排序算法实现的原理及代码详解

步骤:

从数组中选个基准值

将数组中大于基准值的放同一边、小于基准值的放另一边,基准值位于中间位置

递归的对分列两边的数组再排序

代码实现

function quickSort($arr)

{

 $len = count($arr);

 if ($len <= 1) {

  return $arr;

 }

 

 $v = $arr[0];

 $low = $up = array();

 for ($i = 1; $i < $len; ++$i) {

  if ($arr[$i] > $v) {

   $up[] = $arr[$i];

  } else {

   $low[] = $arr[$i];

  }

 }

 $low = quickSort($low);

 $up = quickSort($up);

 

 return array_merge($low, array($v), $up);

}

测试代码:

$startTime = microtime(1);

 

$arr = range(1, 10);

shuffle($arr);

 

echo "before sort: ", implode(', ', $arr), "\n";

$sortArr = quickSort($arr);

echo "after sort: ", implode(', ', $sortArr), "\n";

 

echo "use time: ", microtime(1) - $startTime, "s\n";

测试结果:

before sort: 1, 7, 10, 9, 6, 3, 2, 5, 4, 8

after sort: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

use time: 0.0009009838104248s

时间复杂度

快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。

这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,最多N次。

1) 为什么最少是lg(N+1)次?快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。因此,快速排序的遍历次数最少是lg(N+1)次。

2) 为什么最多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最多是N次。

PHP 相关文章推荐
php学习笔记之 函数声明
Jun 09 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
Jun 13 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
Oct 30 PHP
PHP实现事件机制实例分析
Jun 26 PHP
PHP实现简单搜歌的方法
Jul 28 PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
Yii2框架redis基本应用示例
Jul 13 PHP
java解析json方法总结
May 16 PHP
PHP钩子实现方法解析
May 21 PHP
laravel 创建命令行命令的图文教程
Oct 23 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 #PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
Apr 02 #PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 #PHP
Swoole实现异步投递task任务案例详解
Apr 02 #PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
Apr 02 #PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 #PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
Apr 02 #PHP
You might like
php中的实现trim函数代码
2007/03/19 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
php 高性能书写
2010/12/11 PHP
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
浅析PHP开发规范
2018/02/05 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
python字典get()方法用法分析
2015/04/17 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
python每天定时运行某程序代码
2019/08/16 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
大学生毕业求职的自我评价
2013/09/29 职场文书
教师求职推荐信范文
2013/11/20 职场文书
实习生自我评价
2014/01/18 职场文书
初中科学教学反思
2014/01/21 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
销售岗位职责范本
2014/06/12 职场文书
介绍信怎么写
2015/01/30 职场文书
生日祝酒词大全
2015/08/10 职场文书
护士岗位竞聘书
2015/09/15 职场文书
保险公司岗前培训工作总结
2015/10/24 职场文书