0

C++ と PHP での双方向マージ ソートの例が 2 つあります。C++ の例は正常に動作しますが、PHP は動作しません。

PHPの例が機能しないのはなぜですか? エラーが見つかりません:

function merge($m, $low, $mid, $high)
{
$i = $low;
$j = $mid+1;
$k = 0;
$tmp = array();

while (($i <= $mid) && ($j <= $high))
{
if ($m[$i] > $m[$j])
$tmp[$k++] = $m[$i++];
else 
$tmp[$k++] = $m[$j++];
}

if ($i <= $mid)
{
while ($i <= $mid)
$tmp[$k++] = $m[$i++];
}

if ($j <= $high)
{
while ($j <= $high)
$tmp[$k++] = $m[$j++];
}

for ($i = $low; $i <= $high; $i++)
$m[$i] = $tmp[$i-$low];

return $m;
}

function mergeSort($m, $low, $high)
{
if ($high > $low)
{
$middle = ($high+$low)/2;
mergeSort($m, $low, $middle);
mergeSort($m, $middle+1, $high);
merge($m, $low, $middle, $high);
}
}

$m = array(0,3,2,4);
$m = mergeSort($m, 0, 3);
echo $m[0]; // there null :(

C++ の例、正常に動作します:

 int m[10];
 void merge(int low, int mid, int high)
 {
int i = low;
int j = mid+1;
int z = 0;
int tmp[10] = {0};

while ((i <= mid) && (j <= high))
{
    if (m[i] < m[j])
        tmp[z++] = m[i++];
    else
        tmp[z++] = m[j++];
}

if (i <= mid)
{
    while (i <= mid)
        tmp[z++] = m[i++];
    }

if (j <= high)
{
    while (j <= high)
        tmp[z++] = m[j++];
}

for (int a = low; a <= high; a++)
    m[a] = tmp[a-low];
}

 void mergeSort(int low, int high)
{
if (low < high)
{
    int middle = (high+low)/2;
    mergeSort(low, middle);
    mergeSort(middle+1, high);
    merge(low, middle, high);
}
return;
}

int main(array<System::String ^> ^args)
{

for (int i = 0; i < 10; i++)
    m[i] = rand()%101;

mergeSort(0, 7);

for (int i = 0; i < 10; i++)
    Console::WriteLine("{0}", m[i]);
Console::ReadLine();
return 0;
}

ページの読み込みが長すぎるため、再帰ループがあると思います。しかし、それを確認する方法がわかりません。私は何を間違っていますか?

4

1 に答える 1

0

わかりました、あなたのコードには 2 つの明確な問題があります。

1 つ目は、PHP では、言語が必要と判断したときに自動的に浮動小数点を使用したことです。したがって$middle = ($high+$low)/2;、0.5、0.125 などの値になるため、無限再帰が発生します。そこにキャストを投げintます:

 $middle = (int)(($high+$low)/2);

そしてそれはあなたが望むものをもっと与えてくれます。

2番目の問題は、使用しているが、関数$m = mergeSort(...);に return ステートメントがないことです。これが、返されたときに NULL になるmergeSort理由です。$m

于 2013-07-06T13:35:07.033 に答える