php如何实现并归排序


今天小编给大家分享一下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++实现有序数组中去除重复项”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何用C++实现有序数组中去除重复项”文章能帮助大家解决问题。Given a sorted arraynums, re…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/16 13:07
下一篇 02/16 13:07

相关推荐