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 相关文章推荐
与数据库连接
Oct 09 PHP
PHP的autoload机制的实现解析
Sep 15 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 PHP
zf框架的registry(注册表)使用示例
Mar 13 PHP
destoon整合ucenter后注册页面不跳转的解决方法
Jun 21 PHP
php使用cookie实现记住登录状态
Apr 27 PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 PHP
PHP基于curl后台远程登录正方教务系统的方法
Oct 14 PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
php和nginx交互实例讲解
Sep 24 PHP
PHP二维数组分页2种实现方法解析
Jul 09 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
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
PHP经典面试题集锦
2015/03/19 PHP
详解php中反射的应用
2016/03/15 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
javascript eval函数深入认识
2009/02/21 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
python利用Guetzli批量压缩图片
2017/03/23 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
Python: 传递列表副本方式
2019/12/19 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
结束运行python的方法
2020/06/16 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
《老王》教学反思
2014/02/23 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
化验室安全管理制度
2015/08/06 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python