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的几个经典排序算法及时间复杂度和耗时​相关推荐

  1. 十大经典排序算法详解

    本文转自 <卢明冬的博客> 文章目录 排序算法的分析和评价 2.十大排序经典算法总览 2.1 排序算法的分类 2.2 排序算法的性能 2.3 各阶复杂度性能对比 2.4 排序算法的初始状态 ...

  2. 按复杂度有效性递减排序_十大经典排序算法:python源码实现,通俗深入讲解

    概述 提示:本文上万字,陆陆续续疏理知识点加测试代码,耗时近一个月.阅读时长40分钟左右. 本文将十大经典排序算法进行汇总,从源码实现.复杂度.稳定性进行分析,并对每种排序的特性进行点评.对典型算法, ...

  3. 十大经典排序算法Python版实现(附动图演示)

    来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...

  4. 十大经典排序算法(建议收藏)

    来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述  0.1 算法分类 十种 ...

  5. 一文读懂Python版的十大经典排序算法(附动图演示)

    来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...

  6. 面试必问:十大经典排序算法总结

    0.排序算法的说明0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:不稳定:如果a原本在b前面,而a=b,排序之后 ...

  7. 找出最大和第二大的数PHP,2020-09-01 十大经典排序算法总结php为例

    排序算法说明 1 .排序的定义 对一序列对象根据某个关键字进行排序. 2.术语说明 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定 :如果a原本在b的前面,而a=b,排序之后 ...

  8. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

  9. Algorithm:【Algorithm算法进阶之路】之十大经典排序算法

    Algorithm:[Algorithm算法进阶之路]之十大经典排序算法 相关文章 Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 Algorithm:[Algori ...

  10. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

最新文章

  1. mysql 查看innodb版本,mysql中查看innodb版本的方法
  2. antdesign的input增加自定义校验规则
  3. 弱电工程网络传输基础知识讲解
  4. 第五章 了解你的用户
  5. Linux下使用socket传输文件的C语言简单实现
  6. 构建meteor应用程序_我构建了一个渐进式Web应用程序并将其发布在3个应用程序商店中。 这是我学到的。...
  7. .aspx页面 引用命名空间 (Import 指令,web.config)
  8. django 多并发,多线程。
  9. 目标检测(二十二)--R-FCN
  10. 【技术专题研究】OSPF的LSA类型
  11. git 小札 - 流程总览
  12. PS 复制图层使用
  13. Linux(Ubuntu)触摸屏校准
  14. 1461错误,nbsp;mysql_stmt_prepa…
  15. 求函数:x的n次方(函数递归)
  16. [汇编语言]实现电话簿的创建
  17. 浅谈SVG的两个黑魔法
  18. 4个单词,谷歌返回16个SQL注入漏洞
  19. C++ STL函数 map (henu.hjy)
  20. 抖音矩阵号,优化排名,抖音短视频SEO矩阵系统源码开发。

热门文章

  1. rocketMq消息重复消费问题
  2. 图解50道sql编写题
  3. Error inflating class android.webkit.WebView Caused by: ...: String resource ID #0x2040003
  4. 《树莓派渗透测试实战》——1.7 树莓派渗透测试场景
  5. 一个ExtJs的最基本的mvc模式示例
  6. horizon服务主要模块_得助智能:智能外呼机器人有哪些模块功能层级?
  7. Android中类似Linux下ldd分析可执行文件和动态库对库的依赖
  8. chattr 设置隐藏属性
  9. 第二章 驱动程序调测方法与技巧
  10. Ceph浅析”系列之四——Ceph的结构