今天小编给大家分享一下php如何实现并归排序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 php实现并归排序的方法:1、创建一个PHP示例文件;2、定义“public function handle(){…}”方法;3、通过“private function mergeSort($a, $lo, $hi) {…}”方法把数据逐步分解;4、通过“merge”方法对分解后的数据进行排序,再合并到一起即可。php实现归并排序算法归并排序算法的复免费云主机域名杂度是O(nlogn)。代码如下,只需要clone下来执行composer install
然后执行 php artisan test:mergeSort
就可以看到结果了
/** *归并排序把数据逐步分解,然后对分解后的数据进行排序,最后合并到一起 * *@returnmixed */ publicfunctionhandle() { $this->a=[3,70,4,38,5,6,8,4,7,10,6,10,34,4]; dump($this->a); $a=$this->mergeSort($this->a,0,count($this->a)); dd($a); } privatefunctionmergeSort($a,$lo,$hi){ if(($hi-$lo)>1; //把中点左边的进行归并 $b=$this->mergeSort($a,$lo,$mi); dump('$b:',$b); //把中点右边的进行归并 $c=$this->mergeSort($a,$mi,$hi); dump('$c:',$c); //把所有数据进行排序 return$this->merge($b,$c,$lo,$mi,$hi); } /** *假设有一个数组$a分成了两个数组[3,4][2,8] *逐一比较,3and2,取出来2然后3and8取出来3然后4and8取出来4,最后取出来8 * *@param[type]$lo *@param[type]$mi *@param[type]$hi *@returnvoid */ privatefunctionmerge($b,$c,$lo,$mi,$hi){ $lb=$mi-$lo;//$b数组的边界 $lc=$hi-$mi;//$c数组的边界 $res=[]; //$i表示合并后数组的下标$ib是b数组的下标$ic是c数组的下标 for($i=0,$ib=0,$ic=0;$ib=$lc||比较两个数组首位的大小如果b的首元素=$lc||$b[$ib]=$lb||如果c的首元素=$lb||$b[$ib]>$c[$ic])){ $res[$i++]=$c[$ic++]; } } return$res; }
归并排序和快排刚好相反,是先将整个数组左右打散,然后在逐一合并进行排序,最终完成整个数组的排序,排序示意图如下:首先将整个数组左右打散,变成单个元素,因为单个元素可以被认为是有序的。对应代码
if(($hi-$lo)>1; //把中点左边的进行归并 $b=$this->mergeSort($a,$lo,$mi); dump('$b:',$b); //把中点右边的进行归并 $c=$this->mergeSort($a,$mi,$hi); dump('$c:',$c);
接下来对左右两个有序数组进行排序,假设有一个数组$a分成了两个数组[3,4] [2,8],逐一比较,3and2,取出来2然后3and8取出来3然后4and8取出来4,最后取出来8,对应代码:
$lb=$mi-$lo;//$b数组的边界 $lc=$hi-$mi;//$c数组的边界 $res=[]; //$i表示合并后数组的下标$ib是b数组的下标$ic是c数组的下标 for($i=0,$ib=0,$ic=0;$ib=$lc||比较两个数组首位的大小如果b的首元素=$lc||$b[$ib]=$lb||如果c的首元素=$lb||$b[$ib]>$c[$ic])){ $res[$i++]=$c[$ic++]; } } return$res;
示意图如下:以上就是“php如何实现并归排序”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。
这篇文章主要介绍“如何用C++实现有序数组中去除重复项”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何用C++实现有序数组中去除重复项”文章能帮助大家解决问题。Given a sorted arraynums, re…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。