PHP对数组进行排序操作

昨天别人问了我一个问题,瞬间把我给问懵了。事情是这样的,问我给到一个既定数组,现在让我实现下将数组元素从低到高升序排列。第一个反应是直接使用ksort之类排序函数操作(一时脑子浆糊,这系列函数每次都要翻手册,实际上是asort)。告诉我,不能使用内置函数,需要自己写一个。好吧,这么大的坑,有简单的不用,要来个复杂的。当时写了个简单实现的方案,没多想,晚上闲着没事就想了下效率问题。最近对程序运行效率始终保持敏感。就想测试下各方法效率到底相差多少。

首先需要一个测试的数组,给定100W元素的数组。

第一问题就来了,如何快速有效的生成包含100W元素的无序数组?

其实当时我是想生成一个值为1-100W之间的随机数的。又脑子浆糊没想到啥简单办法,就将就使用下不重复的数据吧,不影响后续进行排序操作。简单办法:

$arr=range(1,1000000,1);
shuffle($arr);

生成了既定数组后,就是排序操作了,这里应用下ThinkPHP5的debug函数,计算下脚本时间。

一、使用asort进行排序操作。

debug('begin');
asort($arr);
debug('end');
dump(debug('begin','end').'s');

输出结果:string(9) "0.711041s"。耗时0.7秒完成了百万数据的排序操作,asort在PHP7的效率还是非常高的。

二、自定义比较排序。

debug('begin');
$length=count($arr);
    for($i=0; $i<$length-1; $i++){
	for($j=$i+1; $j $arr[$j]){
	      $temp = $arr[$i];
	      $arr[$i] = $arr[$j];
	      $arr[$j] = $temp;
	   }
    }
}
debug('end');
dump(debug('begin','end').'s');

for的效率还真是底下,两层for就干脆别提了,意料之中的脚本超时,于是将既定数组缩小的1W。再次运行脚本,输出结果:string(9) "7.845449s"。1W数据竟然高达7秒。

三、冒泡排序。

$length=count($arr);
    $temp =0;
	for($i=0;$i<$length;$i++){ 
	   for($j=0;$j$arr[$j+1]){ 
	          $temp=$arr[$j];
	          $arr[$j]=$arr[$j+1];
	          $arr[$j+1]=$temp; 
	       } 
	   } 
}

运行结果:string(9) "9.343535s"。没想到冒泡竟然也如此低下。但凡两层for的都太低效了。印象中冒泡不能这么低啊,网上搜了下关于冒泡的改进方法。

四、改进版的冒泡排序。

$length = count($arr);
    $flag = TRUE;
	for($i = 0;($i < $length - 1) && $flag;$i ++){
	   $flag = FALSE;
	   for($j = $length - 2;$j >= $i;$j --){
	      if($arr[$j] > $arr[$j + 1]){
	         $temp=$arr[$j];
	         $arr[$j]=$arr[$j+1];
	         $arr[$j+1]=$temp; 
	         $flag = TRUE;
	      }
	 }
}

输出结果:string(9) "8.566490s"。比直接冒泡的提高了不到1秒。

通过简单测试看来还是通过PHP底层运算来的高效和简便。在不能使用内置函数的时候,如果基础知识不稳固,还是蛮吃力的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

代码重构(一):函数重构规则

重构是项目做到一定程度后必然要做的事情。代码重构,可以改善既有的代码设计,增强既有工程的可扩充、可维护性。随着项目需求的不断迭代,需求的不断更新,我们在项目中所...

25850
来自专栏林冠宏的技术文章

经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。

作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:htt...

710150
来自专栏算法channel

其他|c++几个容易混淆的点

希望时间的流逝不仅仅丰富我们的阅历,更重要的是通过提炼让我们得以升华,走向卓越。 1编译出错 一段时间没写c/c++的程序了,最近公司一个项目底层的核心算法是...

34650
来自专栏Java学习网

10种简单的Java性能优化学习

10种简单的Java性能优化学习 你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩...

35860
来自专栏阁主的小跟班的专栏

C++11新特性使用总结

最近开始使用C++11编码,编码效率和代码质量提升不少,把目前我遇到的提升效率和代码质量的新特性都总结一下。

52600
来自专栏Spark学习技巧

你真知道如何高效用mapPartitions吗?

做过一段时间spark的应用开发的小伙伴都会渐渐发现,很没趣,因为都是调API。那么,真的是没趣吗,还是说你本身没有去深入研究呢?通过本文你就会发现自己没成长是...

26220
来自专栏用户2442861的专栏

近一个月的面试总结 分类:JAVA

本文转载自:http://blog.csdn.net/pistolove/article/details/46753275

13320
来自专栏liulun

Nim教程【五】

这是国内第一个关于Nim的系列教程 先说废话 业内的人认为能够直接操作系统硬件的语言才称得上系统级的编程语言 常见的系统级编程语言有:汇编、C、C++、D、GO...

29680
来自专栏青蛙要fly的专栏

Android技能树 — 数组,链表,散列表基础小结

现在安卓面试,对于数据结构的问题也越来越多了,要求也越来越多,所以我对于数据结构只能慢慢补起来了。(灬ꈍ ꈍ灬)

13440
来自专栏魂祭心

原 GetHashCode重写指南(译文)

42860

扫码关注云+社区

领取腾讯云代金券