我正在尝试使用javascript实现合并排序。 以下是我发现的逻辑上合理的代码,但在运行时失败。
var a = [];
for( i = 0 ; i < 10; i++){
a.push(parseInt(Math.random()*100000));
}
function merge(a1, a2){
var res = [];
var i = 0, j = 0;
while( i < a1.length && j < a2.length){
if( a1[i] < a2[j] )
res.push(a1[i++]);
else
res.push(a2[j++]);
}
while( i < a1.length )
res.push(a1[i++]);
while( j < a2.length )
res.push(a2[j++]);
return res;
}
function mergeSort(a){
if( a.length <= 1 )
return a;
var q = a.length/2;
x = mergeSort(a.slice(0,q));
y = mergeSort(a.slice(q));
return merge(x,y);
}
然而,mergeSort(a)方法中具有镜像更改的相同代码会提供所需的结果。 稍有改动的代码如下:
var a = [];
for( i = 0 ; i < 10; i++){
a.push(parseInt(Math.random()*100000));
}
function merge(a1, a2){
var res = [];
var i = 0, j = 0;
while( i < a1.length && j < a2.length){
if( a1[i] < a2[j] )
res.push(a1[i++]);
else
res.push(a2[j++]);
}
while( i < a1.length )
res.push(a1[i++]);
while( j < a2.length )
res.push(a2[j++]);
return res;
}
function mergeSort(a){
if( a.length <= 1 )
return a;
var q = a.length/2;
return merge(mergeSort(a.slice(0,q)),mergeSort(a.slice(q)));
}
答案 0 :(得分:2)
因为您没有使用'var'声明这些变量,所以它们是全局范围的:
x = mergeSort(a.slice(0,q));
y = mergeSort(a.slice(q));
答案 1 :(得分:1)
你的x和y变量是全局的(因为你没有用var
声明它们是本地的),所以每次调用mergeSort函数时,它都会改变相同的变量,导致非常意外的行为。 / p>
修正:
function mergeSort(a){
if( a.length <= 1 )
return a;
var q = a.length/2;
var x = mergeSort(a.slice(0,q));
var y = mergeSort(a.slice(q));
return merge(x,y);
}