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 24 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
Jul 03 PHP
提升PHP性能的21种方法介绍
Jun 25 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
Php-Redis安装测试笔记
Mar 05 PHP
PHP生成及获取JSON文件的方法
Aug 23 PHP
php array_values 返回数组的所有值详解及实例
Nov 12 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
Apr 15 PHP
PHP中的自动加载操作实现方法详解
Aug 06 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 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获得文件扩展名三法
2006/11/25 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
php的socket编程详解
2016/11/20 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
Django app配置多个数据库代码实例
2019/12/17 Python
python判断链表是否有环的实例代码
2020/01/31 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
英国最大的海报商店:GB Posters
2018/03/20 全球购物
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
本科毕业生自我鉴定
2013/11/02 职场文书
2014婚礼司仪主持词
2014/03/14 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
在python中实现导入一个需要传参的模块
2021/05/12 Python
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
用Java实现简单计算器功能
2021/07/21 Java/Android