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 相关文章推荐
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
一些php技巧与注意事项分析
Feb 03 PHP
PHP的范围解析操作符(::)的含义分析说明
Jul 03 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
May 19 PHP
php语言的7种基本的排序方法
Dec 28 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
微信 getAccessToken方法详解及实例
Nov 23 PHP
PHP面向对象学习之parent::关键字
Jan 18 PHP
php输出图像的方法实例分析
Feb 16 PHP
解析 thinkphp 框架中的部分方法
May 07 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
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
JQuery选择器特辑 详细小结
2012/05/14 Javascript
jQuery使用之处理页面元素用法实例
2015/01/19 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
详解写好JS条件语句的5条守则
2019/02/28 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
浅谈python中截取字符函数strip,lstrip,rstrip
2015/07/17 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
linux面试题参考答案(8)
2015/08/11 面试题
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
python全面解析接口返回数据
2022/02/12 Python