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 相关文章推荐
phpmyadmin操作流程
Oct 09 PHP
php数据库连接
Oct 09 PHP
PHP制作图型计数器的例子
Oct 09 PHP
PHP 的 __FILE__ 常量
Jan 15 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
Nov 09 PHP
php和jquery实现地图区域数据统计展示数据示例
Feb 12 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
PHP实现懒加载的方法
Mar 07 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 PHP
PHP扩展类型及安装方式解析
Apr 27 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程序?
2006/12/08 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
javascript 中的console.log和弹出窗口alert
2016/08/30 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
Python功能键的读取方法
2015/05/28 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Django的models模型的具体使用
2019/07/15 Python
python集合常见运算案例解析
2019/10/17 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
详解Python中namedtuple的使用
2020/04/27 Python
Django如何重置migration的几种情景
2021/02/24 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
2014基层党员批评与自我批评范文
2014/09/24 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP