当前位置:首页 > CN2资讯 > 正文内容

php排序php多维数组排序

2天前CN2资讯
/* * php 四种排序算法的时间与内置的sort排序比较 * 3000个元素,四种算法的排序所用的时间比较 * 冒泡排序 857.98192024231ms * 选择排序 903.74493598938ms * 插入排序 296.8270778656ms * 快速排序 15.607833862305ms * sort排序 0.95200538635254ms * 归并排序 14.61386680603ms * */ /* * @param 冒泡排序 * 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。 * 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 * */ function BubbleSort($arr) { $len = count($arr); //设置一个空数组 用来接收冒出来的泡 //该层循环控制 需要冒泡的轮数 for ($i = 1; $i < $len; $i++) { $flag = false; //本趟排序开始前,交换标志应为假 //该层循环用来控制每轮 冒出一个数 需要比较的次数 for ($k = 0; $k < $len - $i; $k++) { //从小到大排序 if ($arr[$k] > $arr[$k + 1]) { $tmp = $arr[$k + 1]; $arr[$k + 1] = $arr[$k]; $arr[$k] = $tmp; $flag = true; } } if(!$flag) return $arr; } } /* * @param 选择排序法 * 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 * 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) * */ function selectSort($array){ $temp = 0; for($i = 0;$i < count($array) - 1;$i++){ $minVal = $array[$i]; //假设$i就是最小值 $minValIndex = $i; for($j = $i+1;$j < count($array);$j++){ if($minVal > $array[$j]){ //从小到大排列 $minVal = $array[$j]; //找最小值 $minValIndex = $j; } } $temp = $array[$i]; $array[$i] = $array[$minValIndex]; $array[$minValIndex] = $temp; } } /* * 插入排序法 * 每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 * 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。 * */ function insertSort($array){ //从小到大排列 //先默认$array[0],已经有序,是有序表 for($i = 1;$i < count($array);$i++){ $insertVal = $array[$i]; //$insertVal是准备插入的数 $insertIndex = $i - 1; //有序表中准备比较的数的下标 while($insertIndex >= 0 && $insertVal < $array[$insertIndex]){ $array[$insertIndex + 1] = $array[$insertIndex]; //将数组往后挪 $insertIndex--; //将下标往前挪,准备与前一个进行比较 } if($insertIndex + 1 !== $i){ $array[$insertIndex + 1] = $insertVal; } } } /* * 快速排序法 * 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, * 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 * */ function quickSort($array){ if(!isset($array[1])) return $array; $mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素 $leftArray = array(); $rightArray = array(); foreach($array as $v){ if($v > $mid) $rightArray[] = $v; //把比$mid大的数放到一个数组里 if($v < $mid) $leftArray[] = $v; //把比$mid小的数放到另一个数组里 } $leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割 $leftArray[] = $mid; //把分割的元素加到小的数组后面,不能忘了它哦 $rightArray = quickSort($rightArray); //把比较大的数组再一次进行分割 return array_merge($leftArray,$rightArray); //组合两个结果 } /* * 归并排序 * 归并排序是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。 * 这样的排序方法经常用于多个有序的数据文件归并成一个有序的数据文件。 * */ function mergeSort(&$arr) { $len = count($arr);//求得数组长度 mSort($arr, 0, $len-1); return $arr; } //实际实现归并排序的程序 function mSort(&$arr, $left, $right) { if($left < $right) { //说明子序列内存在多余1个的元素,那么需要拆分,分别排序,合并 //计算拆分的位置,长度/2 去整 $center = floor(($left+$right) / 2); //递归调用对左边进行再次排序: mSort($arr, $left, $center); //递归调用对右边进行再次排序 mSort($arr, $center+1, $right); //合并排序结果 mergeArray($arr, $left, $center, $right); } } //将两个有序数组合并成一个有序数组 function mergeArray(&$arr, $left, $center, $right) { //设置两个起始位置标记 $a_i = $left; $b_i = $center+1; while($a_i<=$center && $b_i<=$right) { //当数组A和数组B都没有越界时 if($arr[$a_i] < $arr[$b_i]) { $temp[] = $arr[$a_i++]; } else { $temp[] = $arr[$b_i++]; } } //判断 数组A内的元素是否都用完了,没有的话将其全部插入到C数组内: while($a_i <= $center) { $temp[] = $arr[$a_i++]; } //判断 数组B内的元素是否都用完了,没有的话将其全部插入到C数组内: while($b_i <= $right) { $temp[] = $arr[$b_i++]; } //将$arrC内排序好的部分,写入到$arr内: for($i=0, $len=count($temp); $i<$len; $i++) { $arr[$left+$i] = $temp[$i]; } } $a = array_rand(range(1,10000), 3000); //生成3000个元素的随机数组 shuffle($a); //打乱数组的顺序 $t1 = microtime(true); BubbleSort($a); //冒泡排序 $t2 = microtime(true); echo "冒泡排序用时:".(($t2-$t1)*1000).'ms'."\n"; $t3 = microtime(true); selectSort($a); //选择排序 $t4 = microtime(true); echo "选择排序用时:".(($t4-$t3)*1000).'ms'."\n"; $t5 = microtime(true); insertSort($a); //插入排序 $t6 = microtime(true); echo "插入排序用时:".(($t6-$t5)*1000).'ms'."\n"; $t7 = microtime(true); quickSort($a); //快速排序 $t8 = microtime(true); echo "快速排序用时:".(($t8-$t7)*1000).'ms'."\n"; $t9 = microtime(true); sort($a); $t10 = microtime(true); echo "sort排序用时:".(($t10-$t9)*1000)."ms"."\n"; $t11 = microtime(true); mergeSort($a); $t12 = microtime(true); echo "归并排序用时:".(($t12-$t11)*1000)."ms";

  

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/26112.html

    标签: php排序
    分享给朋友:
    返回列表

    上一篇:PHP CGI

    下一篇:PHP之旅

    “php排序php多维数组排序” 的相关文章

    域名购买推荐:如何选择最适合你的域名注册商

    域名购买推荐概述 在互联网时代,域名显得尤为重要。对于个人用户、企业甚至是初创团队来说,域名不仅是网站的门面,更是品牌形象和业务宣传的基石。记得我第一次建立网站时,选择一个合适的域名让我意识到它的价值。一个容易记住、与品牌相关的域名可以有效吸引流量,提升访问者的信任感。 在选购域名时,有几点基本原则...

    APT攻击解析:如何应对高级持续性威胁

    APT攻击,或称为高级持续性威胁,是一种复杂的网络攻击形式。这种攻击的发起者通常是具有高度组织性和专业性的攻击者,可能是国家支持的黑客组织,或者其他有目的的恶意实体。他们的目标不仅仅是短期内造成损害,而是着眼于更长远的战略性目标,比如窃取国家机密、企业的核心技术或其他商业秘密。这种攻击对目标组织的声...

    瓦工职业特征与发展前景分析

    瓦工,这个听起来有些古老的职业,实际上在我们的社会中扮演着举足轻重的角色。它主要负责砌筑工作,用砖块、砌块和砂浆等材料建造房屋、烟囱等不同结构。北方地区的人们常常把瓦工称为泥工,虽然这两者有些细微差别,但归根结底,瓦工是建筑行业不可缺少的一个部分。 在瓦工的工作范围里,涉及到建筑砌体、隔墙、瓦片铺装...

    甲骨文云无法选择ARM架构的原因及解决方案

    在如今这个信息化的时代,云计算技术已经成为了各类企业和个人用户的重要工具。而甲骨文云服务器正是众多云服务中的一员,凭借其强大的计算能力和灵活的可扩展性,吸引了越来越多的用户。甲骨文云服务器为用户提供了一种高效、灵活的解决方案,让他们能够在不同的业务需求下,快速部署和管理自己的应用程序。 当谈到甲骨文...

    如何购买域名:选择与交易的完整指南

    购买域名是启动网站或在线服务不可或缺的一步。对于很多人来说,域名不仅是网站的门面,更是品牌的形象。想象一下,拥有一个简洁、易记的域名能够让用户更轻松地找到你的服务或产品,并在他们心中留下深刻的印象。 域名的功能多种多样,它不仅能帮助你构建互联网身份,还能影响网站在搜索引擎中的排名。因此,选择一个合...

    CloudFront在病毒防护中的应用与安全策略解析

    在互联网时代,内容分发网络(CDN)扮演着至关重要的角色。CloudFront便是亚马逊提供的一款优秀的CDN服务。简单来说,CloudFront分发数据、视频、应用程序和API,可以通过全球的边缘位置快速传递内容。这种网络架构的设计使得用户能够从离他们最近的服务器获取信息,从而提升了访问速度和用户...