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中几种常见的超时处理全面总结
Sep 11 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
php+mysql数据库查询实例
Jan 21 PHP
php限制文件下载速度的代码
Oct 20 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 PHP
php从身份证获取性别和出生年月
Feb 09 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 PHP
php访问对象中的成员的实例方法
Nov 17 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
ThinkPHP控制器详解
2015/07/27 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
实例讲解PHP表单
2020/06/10 PHP
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
javascript事件问题
2009/09/05 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
vue2过滤器模糊查询方法
2018/09/16 Javascript
vue如何获取自定义元素属性参数值的方法
2019/05/14 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
详解python的argpare和click模块小结
2019/03/31 Python
德购商城:德国进口直邮商城
2017/06/13 全球购物
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
艺术应用与设计个人的自我评价
2013/11/23 职场文书
教师一帮一活动总结
2014/07/08 职场文书
2014年统计工作总结
2014/11/21 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书