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 相关文章推荐
使用Xdebug调试和优化PHP程序之[1]
Apr 17 PHP
php实现mysql同步的实现方法
Oct 21 PHP
详解php的魔术方法__get()和__set()使用介绍
Sep 19 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
html静态页面调用php文件的方法
Nov 13 PHP
Yii框架登录流程分析
Dec 03 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
php高清晰度无损图片压缩功能的实现代码
Dec 09 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
Mar 09 PHP
如何用PHP实现多线程编程
May 26 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自动跳转中英文页面
2008/07/29 PHP
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
php的mssql数据库连接类实例
2014/11/28 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
用javascript实现自定义标签
2007/05/08 Javascript
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Django内容增加富文本功能的实例
2017/10/17 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
python学生信息管理系统(完整版)
2020/04/05 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
幼儿园元旦活动感言
2014/03/02 职场文书
3的组成教学反思
2014/04/30 职场文书
学校募捐倡议书
2014/05/14 职场文书
服务宗旨标语
2014/07/01 职场文书
2014财务年终工作总结
2014/12/08 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
python 学习GCN图卷积神经网络
2022/05/11 Python