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 相关文章推荐
phpmyadmin 访问被拒绝的真实原因
Jun 15 PHP
php IP转换整形(ip2long)的详解
Jun 06 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
php与java通过socket通信的实现代码
Oct 21 PHP
PHP URL路由类实例
Nov 12 PHP
ThinkPHP标签制作教程
Jul 10 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
PHP 接入支付宝即时到账功能
Sep 18 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
PHP字符串与数组处理函数用法小结
Jan 07 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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与MySQL交互使用详解
2006/10/09 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
jQuery 获取URL参数的插件
2010/03/04 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
微信小程序实现美团菜单
2018/06/06 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
Python标准库之itertools库的使用方法
2017/09/07 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
毕业自我评价范文
2013/11/17 职场文书
幼儿园五一活动方案
2014/02/07 职场文书
水利公司纪检监察自我鉴定
2014/02/25 职场文书
外语系大学生自荐信范文
2014/03/01 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL