【发布时间】:2020-08-05 03:28:43
【问题描述】:
合并功能正常工作。我在合并排序中有 2 个查询 1)当count==1条件同时满足左右两次时,我无法理解为什么“合并”函数在这里调用第三次(打印执行)。 2) 如果我评论 return $x 然后打印 $x 第三次显示空白数组,否则 $x 第三次显示排序数组为什么?
$arr= array(4,2,7,5);
$count= count($arr);
//Merge Sort
$result= merging($arr);
//echo "<pre>"; print_r($result); exit;
function merging($arr)
{
$count= count($arr);
if($count==1){ return $arr; }
$mid= ceil($count/2);
$left= array_slice($arr,0,$mid);
$right= array_slice($arr,$mid);
$left= merging($left);
$right= merging($right);
echo "execute";
$x= merge($left,$right);
echo "<pre>"; print_r($x); //exit;
//return $x;
}
function merge($left,$right)
{
//echo "<pre>"; print_r($left);
//echo "<pre>"; print_r($right);
$l=0; $r=0; $temp=[];
while($l<count($left) && $r<count($right))
{
if($left[$l]> $right[$r])
{
$temp[]= $right[$r];
$r++;
}else{
$temp[]= $left[$l];
$l++;
}
}
while($l < count($left))
{
$temp[]= $left[$l];
$l++;
}
while($r < count($right))
{
$temp[]= $right[$r];
$r++;
}
return $temp;
}
【问题讨论】:
-
merging()是一个奇怪的方法名称选择,因为它是“拆分”或“减半”。我仍在尝试了解您奇怪的递归函数要完成的工作。 -
@mickmackusa 好的,你能帮我解释一下为什么要执行第三次合并函数吗?
-
@NigelRen 第一次合并运行 count==1 完成 left=4,right=2 然后第二次 count==1 完成并且 left=7,right=5 之后为什么合并函数在 count= 时执行=1 不满足。
-
@AnilTomar 我一直盯着你的剧本在思考——无论你想要做什么,都必须有更好的方法。以下是一些诊断:3v4l.org/ePo7H
-
再看多一点,它看起来有点像冒泡排序。它拆分列表,然后对每一边进行排序,这反过来又拆分列表,直到列表中只有一项。然后将结果合并到一个排序列表中备份链。因此,每次调用都会对每个连续更小的项目列表进行排序。
标签: php sorting recursion merge