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 SQL防注入代码集合
Apr 25 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
PHP基础学习小结
Apr 17 PHP
领悟php接口中interface存在的意义
Jun 27 PHP
php+ajax实时输入自动搜索匹配的方法
Dec 26 PHP
浅谈使用PHP开发微信支付的流程
Oct 04 PHP
php操纵mysqli数据库的实现方法
Sep 18 PHP
php实现URL加密解密的方法
Nov 17 PHP
thinkPHP中配置的读取与C方法详解
Dec 05 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
Laravel如何自定义command命令浅析
Mar 23 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 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
PHP 文件类型判断代码
2009/03/13 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
php定时执行任务设置详解
2015/02/06 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
python读取oracle函数返回值
2016/07/18 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
网上签名寄语活动留言
2014/01/18 职场文书
大学校务公开实施方案
2014/03/31 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
护士2015年终工作总结
2015/04/29 职场文书
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js