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 相关文章推荐
解决GD中文乱码问题
Feb 14 PHP
php 删除记录实现代码
Mar 12 PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
PHP经典面试题之设计模式(经常遇到)
Oct 15 PHP
php有效防止同一用户多次登录
Nov 19 PHP
PHP微信开发之有道翻译
Jun 23 PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
Apr 08 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
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
初识ThinkPHP控制器
2016/04/07 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
python3实现高效的端口扫描
2019/08/31 Python
Python函数基本使用原理详解
2020/03/19 Python
css3的transition属性详解
2014/12/15 HTML / CSS
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
外贸业务员求职自荐信分享
2013/09/21 职场文书
工程地质勘察专业大学生求职信
2013/10/13 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
2015年班干部工作总结
2015/04/29 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
交流会主持词
2015/07/02 职场文书
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
Python Matplotlib绘制条形图的全过程
2021/10/24 Python