php算法复杂度,php的几个经典排序算法及时间复杂度和耗时
php排序算法是php的基础,而算法又是区分一个程序员水平高低的重要指标,这里总结了php比较经典的几个排序算法及测试各自的耗时,及其时间复杂度。
我首先想到的排序算法是这样的,那数组中的第一个数去跟其他元素比较,遇到比他小的元素即交换,然后继续比较,一个轮询下来确定第一位就是最小的,然后比较第二个元素,(我给他取名叫一般排序法),代码如下
function normal($arr,$length){
$num = 0;
for ($i=0; $i
for ($j=$i+1; $j
if ($arr[$i]>$arr[$j]) {
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
$num++;
}
}
}
echo "循环次数".$num."
";
echo "一般排序最终结果:".implode($arr,',')."
";
}
$arr = [];这个算法耗时怎么样呢,这里利用随机数生成一个10000长度的一个数组测试一下for ($i=0; $i
array_push($arr,rand(0,10000));
}
php排序里的经典算法首先想到的就是冒泡排序法,测试结果:排序用时(秒):5.2821290493011
排序思想:两两交换小数上浮大数下沉每轮浮出一个最小数
代码如下function maopao($arr,$length){
$flag = true;
$num = 0;
for ($i=0; $i
$flag = false;
for ($j=$length-2; $j >= $i; $j--) {
//从数组末尾开始比较交换
if ($arr[$j]>$arr[$j+1]) {
$flag = true;
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
$num++;
}
}
}
echo "循环次数".$num."
";
echo "冒泡排序最终结果:".implode($arr,',')."
";
}
另一个经典的排序算法叫快速排序法,顾名思义这种排序方法排序非常快耗时测算:6.6322381496429
排序思想:那一个数去跟数组中其他数做比较,比它小的放到左边,比它大的放到右边,这样递归查询最后得到的就是一个有序数组
代码如下:function quicksort($arr,$length){
if ($length<=1) {
return $arr;
}
$left_arr = array();
$right_arr = array();
$basenum = $arr[0];
for ($i=1; $i
if ($basenum > $arr[$i]) {
$left_arr[] = $arr[$i];
}else{
$right_arr[] = $arr[$i];
}
}
//
$left_arr = quicksort($left_arr,count($left_arr));
$right_arr = quicksort($right_arr,count($right_arr));
return array_merge($left_arr,array($basenum),$right_arr);
}
可以看到相比较之前两种算法,快速排序法可以说是效率提升非常高的,不过后面有比快速排序法更快的排序方法耗时测算:0.075751066207886
选择排序法
排序思想:选出最小数或最大数与第一位交换,然后再剩下的里边选出最小与第二位交换以此类推
代码如下:function select($arr){
$length = count($arr);
//外层循环控制轮数
for ($i=0; $i
//假设$i的位置为最小数
$p = $i;
//内层循环选出最小值
for ($j=$i+1; $j
//与$j进行比较
if($arr[$p]>$arr[$j]){
$p = $j;
}
}
//进行最小数交换
$temp = $arr[$i];
$arr[$i] = $arr[$p];
$arr[$p] = $temp;
}
return $arr;
}
插入排序法耗时测算:3.2349390983582
排序思想:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序
代码如下:
function insert($arr){
$length = count($arr);
//外层循环控制
for ($i=1; $i
for ($j=$i-1; $j >=0 ; $j--) {
if($arr[$j]>$arr[$j+1]){
//交换
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}else{
break;
}
}
}
return $arr;
}
以上几种排序算法除快速排序法外都在3-6秒,可以说它们具有相同的时间复杂度,而它们都是采用的两层循环,所以它们的时间复杂度就是O(n²)。耗时测算:4.5077250003815
而快速排序法采用一重循环,它的时间复杂度为O(nlogn),其中log指的是数学中的对数。
以上排序算法是PHP的基础知识
而我们项目中如果需要php对数组进行排序用那种排序方式呢,sort排序,没错就是php的sort函数
我们来测试一下sort的排序耗时:
sort($arr);
echo "sort排序最终结果:".implode($arr,',')."
";
比快速排序法还要高出一个数量级,至于sort排序的底层是怎么实现的,大牛们可以去研究一下内核排序用时(秒):0.0046110153198242
下面是不同的时间复杂度
php算法复杂度,php的几个经典排序算法及时间复杂度和耗时相关推荐
- 十大经典排序算法详解
本文转自 <卢明冬的博客> 文章目录 排序算法的分析和评价 2.十大排序经典算法总览 2.1 排序算法的分类 2.2 排序算法的性能 2.3 各阶复杂度性能对比 2.4 排序算法的初始状态 ...
- 按复杂度有效性递减排序_十大经典排序算法:python源码实现,通俗深入讲解
概述 提示:本文上万字,陆陆续续疏理知识点加测试代码,耗时近一个月.阅读时长40分钟左右. 本文将十大经典排序算法进行汇总,从源码实现.复杂度.稳定性进行分析,并对每种排序的特性进行点评.对典型算法, ...
- 十大经典排序算法Python版实现(附动图演示)
来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...
- 十大经典排序算法(建议收藏)
来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述 0.1 算法分类 十种 ...
- 一文读懂Python版的十大经典排序算法(附动图演示)
来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...
- 面试必问:十大经典排序算法总结
0.排序算法的说明0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:不稳定:如果a原本在b前面,而a=b,排序之后 ...
- 找出最大和第二大的数PHP,2020-09-01 十大经典排序算法总结php为例
排序算法说明 1 .排序的定义 对一序列对象根据某个关键字进行排序. 2.术语说明 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定 :如果a原本在b的前面,而a=b,排序之后 ...
- 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)
上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...
- Algorithm:【Algorithm算法进阶之路】之十大经典排序算法
Algorithm:[Algorithm算法进阶之路]之十大经典排序算法 相关文章 Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 Algorithm:[Algori ...
- java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...
点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...
最新文章
- mysql 查看innodb版本,mysql中查看innodb版本的方法
- antdesign的input增加自定义校验规则
- 弱电工程网络传输基础知识讲解
- 第五章 了解你的用户
- Linux下使用socket传输文件的C语言简单实现
- 构建meteor应用程序_我构建了一个渐进式Web应用程序并将其发布在3个应用程序商店中。 这是我学到的。...
- .aspx页面 引用命名空间 (Import 指令,web.config)
- django 多并发,多线程。
- 目标检测(二十二)--R-FCN
- 【技术专题研究】OSPF的LSA类型
- git 小札 - 流程总览
- PS 复制图层使用
- Linux(Ubuntu)触摸屏校准
- 1461错误,nbsp;mysql_stmt_prepa…
- 求函数:x的n次方(函数递归)
- [汇编语言]实现电话簿的创建
- 浅谈SVG的两个黑魔法
- 4个单词,谷歌返回16个SQL注入漏洞
- C++ STL函数 map (henu.hjy)
- 抖音矩阵号,优化排名,抖音短视频SEO矩阵系统源码开发。
热门文章
- rocketMq消息重复消费问题
- 图解50道sql编写题
- Error inflating class android.webkit.WebView Caused by: ...: String resource ID #0x2040003
- 《树莓派渗透测试实战》——1.7 树莓派渗透测试场景
- 一个ExtJs的最基本的mvc模式示例
- horizon服务主要模块_得助智能:智能外呼机器人有哪些模块功能层级?
- Android中类似Linux下ldd分析可执行文件和动态库对库的依赖
- chattr 设置隐藏属性
- 第二章 驱动程序调测方法与技巧
- Ceph浅析”系列之四——Ceph的结构