2013-07-06 67 views
0

我有两个在C++和PHP上进行双向合并排序的相同示例。 C++示例工作正常,但PHP不。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; 
} 

我想,有递归循环,因为网页加载时间过长。 但不知道如何检查它。 我做错了什么?

+2

php内置合并排序功能c – DevZer0

+2

基本上你需要调试代码,这几乎都是错误的。数组的语义和按值传递参数在PHP中是非常不同的,你不能仅仅从C++传递类似的代码并期望它能够工作。 – Jon

+0

这不是C++,缩进是_horrendous_。你只是代码审查失败,你是否在我的团队中。 –

回答

0

好的,你的代码有两个不同的问题。

第一个是在PHP中,语言在认为需要时自动使用浮点。因此,您的$middle = ($high+$low)/2;将导致0.5,0.125等值,从而导致无限递归。在那里抛出投给int

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

,你想要什么它给你更多。

第二个问题是您正在使用$m = mergeSort(...);,但在mergeSort函数中没有返回语句。这就是为什么$m当你收回时为NULL。

+0

非常感谢你的意见。我现在做了,脚本执行的时间已经回到了速度。但我仍然有问题的代码:我做了$ m数组作为全局,并从函数的参数中删除它,但没有发生与该数组...我检查函数执行 - 他们的工作,但没有任何变化( – FireForce

+0

所以,你有在相关位置增加了'global $ m;' –

+0

我在声明这两个函数之前加了'global $ m;',并用'$ m = array(1,3,2,5);'初始化它' At脚本结尾我写了'echo $ m [1];'并且它返回了3给我...但是应该是2 – FireForce