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中支持多种编码的中文字符串截取函数!
Mar 20 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
php文件怎么打开 如何执行php文件
Dec 21 PHP
非常好用的Zend Framework分页类
Jun 25 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
详解PHP中的序列化、反序列化操作
Mar 21 PHP
PHP编程获取各个时间段具体时间的方法
May 26 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
php引用和拷贝的区别知识点总结
Sep 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访问查询mysql数据的三种方法
2006/10/09 PHP
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
jQuery示例收集
2010/11/05 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
总结js函数相关知识点
2018/02/27 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
js实现双色球效果
2020/08/02 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
大学生简单自荐信
2013/11/10 职场文书
夏季奶茶店创业计划书
2014/01/16 职场文书
酒店员工检讨书
2014/02/18 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
基层党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
培训感想范文
2015/08/07 职场文书
婚庆答谢词大全
2015/09/29 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL