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中实现中文字符进制转换原理分析
Dec 06 PHP
调试一段PHP程序时遇到的三个问题
Jan 17 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
php去除html标记的原生函数详解
Jan 27 PHP
php实现图片上传、剪切功能
May 07 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 09 PHP
php使用正则表达式获取字符串中的URL
Dec 29 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
PHP删除数组中指定下标的元素方法
Feb 03 PHP
PHP类的自动加载机制实现方法分析
Jan 10 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/11/12 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
js window.open弹出新的网页窗口
2014/01/16 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
JS常用函数使用指南
2014/11/23 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
jQuery实现简单弹窗遮罩效果
2017/02/27 Javascript
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
layui使用label标签的方法
2019/09/14 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
python 输出所有大小写字母的方法
2019/01/02 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
python为什么会环境变量设置不成功
2020/06/23 Python
东方电视购物:东方CJ
2016/10/12 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
驳回起诉民事裁定书
2015/05/19 职场文书
二审代理词范文
2015/05/25 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏