[英]Javascript: What is wrong with this javascript implementation of merge sort?
我正在嘗試使用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)));
}
由於尚未使用'var'聲明這些變量,因此它們在全局范圍內:
x = mergeSort(a.slice(0,q));
y = mergeSort(a.slice(q));
您的x和y變量是全局變量(因為尚未使用var
將它們聲明為局部變量),因此,每次調用mergeSort函數時,它將更改相同的變量,從而導致非常意外的行為。
固定:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.