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 相关文章推荐
简单的过滤字符串中的HTML标记
Dec 25 PHP
DISCUZ 论坛管理员密码忘记的解决方法
May 14 PHP
php面向对象全攻略 (五) 封装性
Sep 30 PHP
PHP 分页原理分析,大家可以看看
Dec 21 PHP
PHP字符串处理的10个简单方法
Jun 30 PHP
PHP中static关键字原理的学习研究分析
Jul 18 PHP
有关PHP中MVC的开发经验分享
May 17 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
destoon官方标签大全
Jun 20 PHP
基于PHP实现数据分页显示功能
May 26 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
Dec 08 PHP
PHP数组与字符串互相转换实例
May 05 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正则表达式使用的详细介绍
2013/04/27 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
php中addslashes函数与sql防注入
2014/11/17 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
React数据传递之组件内部通信的方法
2017/12/31 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
python实现文本文件合并
2015/12/29 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
python实现决策树
2017/12/21 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
python缩进长度是否统一
2020/08/02 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
展会邀请函范文
2014/01/26 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js