【问题标题】:Explanation of Merge Sorting with PHPPHP合并排序的解释
【发布时间】: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


【解决方案1】:

我不确定我是否能够让你满意地解释自己,但我确实沉迷于玩这段代码,并从网上找到了一些其他类似的 sn-ps:

至于您的代码,通过注释掉返回值,较高级别的递归被拒绝来自后续/较低级别的递归的更新数据。换句话说,null 被传回了merging(),而不是数组类型的数据——这当然是不可迭代/不可数的。

我还发现您的代码太多,我的大脑无法理解,因此我进行了一些更改以减少代码膨胀和一次性变量。

代码:(Demo)

function mergeSort($array) {
    echo "array = " . json_encode($array) . "\n";
    $count = count($array);
    if ($count == 1) {
        return $array;
    }
    return merge(
        mergeSort(array_splice($array, 0, $count / 2)),
        mergeSort($array)  // use the leftovers
    );
}

function merge($half1, $half2) {
    do {
        $temp[] = $half1[0] < $half2[0] ? array_shift($half1) : array_shift($half2);
    } while(isset($half1[0], $half2[0]));
    return array_merge($temp, $half1, $half2);  // gather any potential remaining elements
}

$input = [4, 2, 7, 5, 3];
$input = mergeSort($input);
var_export($input);

输出:

array = [4,2,7,5,3]
array = [4,2]
array = [4]
array = [2]
array = [7,5,3]
array = [7]
array = [5,3]
array = [5]
array = [3]
array (
  0 => 2,
  1 => 3,
  2 => 4,
  3 => 5,
  4 => 7,
)

或者根据你的输入,输出是:

array = [4,2,7,5]
array = [4,2]
array = [4]
array = [2]
array = [7,5]
array = [7]
array = [5]
array (
  0 => 2,
  1 => 4,
  2 => 5,
  3 => 7,
)

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多