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 相关文章推荐
PHP5.0对象模型探索之抽象方法和抽象类
Sep 05 PHP
PHP开发框架总结收藏
Apr 24 PHP
PHP filter_var() 函数 Filter 函数
Apr 25 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
Nov 28 PHP
PHP多线程之内部多线程实例分析
Mar 09 PHP
php对文件进行hash运算的方法
Apr 03 PHP
变量在 PHP7 内部的实现(一)
Dec 21 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
thinkPHP5.0框架安装教程
Mar 25 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
详细解读php的命名空间(一)
Feb 21 PHP
laravel orm 关联条件查询代码
Oct 21 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/08/05 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
JavaScript中实现最高效的数组乱序方法
2014/10/11 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
js简单实现图片延迟加载的方法
2016/07/19 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
python 域名分析工具实现代码
2009/07/15 Python
详解Python中for循环的使用
2015/04/14 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
获取Django项目的全部url方法详解
2017/10/26 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
婚前保证书
2014/04/29 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
Django实现聊天机器人
2021/05/31 Python
浅谈JS的原型和原型链
2021/06/04 Javascript
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python
Java获取字符串编码格式实现思路
2022/09/23 Java/Android