2016-12-20 60 views
1

我想在JS中實現一個基本的mergesort。我正在使用promise和flowtype。但是,當我的當前實現永遠不會停止遞歸,當數組被分割到2的長度以下時。有人能告訴我我做錯了什麼嗎?mergesort與遞歸的承諾

let inputArr: Array<Number> = [1,2,8,3,2,10,9,7,5]; 
let mergesortAsync = function(input:Array<Number>) { 
    "use strict"; 
    return new Promise((resolve,reject)=>{ 
    if(input.length <2){ 
     console.log('reached bottom, bottom: ',input); 
     resolve(input); 
    } 
    var splitPoint:Number = parseInt(input.length/2); 
    var left:Array<Number> = input.slice(0,splitPoint); 
    var right:Array<Number> = input.slice(splitPoint,input.length); 
    var sortedLeft:Array<Number>; 
    var sortedRight:Array<Number>; 

    mergesortAsync(left).then(sortLeftResult=>{ 
     sortedLeft = sortLeftResult; 
     mergesortAsync(right).then(sortRightResult => { 
     sortedRight = sortRightResult; 
     console.log('sorted left: ',sortedLeft,' sorted right: ',sortedRight,' input: ',input, 'splitPoint: ',splitPoint); 
     mergeAsync(input.slice(),sortedLeft,sortedRight).then(result => { 
      resolve(result); 
     }); 
     }); 
    }); 
    }); 
}; 
let mergeAsync = function(mergeInto: Array<Number>, left: Array<Number>, right: Array<Number>){ 
    return new Promise((resolve,reject)=>{ 
    "use strict"; 
    var mIndex:Number = 0; 
    var lIndex:Number = 0; 
    var rIndex:Number = 0; 
    console.log('Merge start: mergeInto: ',mergeInto, ' left: ',left, ' right: ',right); 
    for(mIndex=0; (lIndex< left.length && rIndex<right.length) ;mIndex++){ 
     if(left[mIndex]<=right[mIndex]){ 
     mergeInto[mIndex] = left[lIndex]; 
     lIndex++; 
     } else{ 
     mergeInto[mIndex] = right[rIndex]; 
     rIndex++; 
     } 
     console.log('Looping - mIndex: ',mIndex,' rIndex: ',rIndex, ' lIndex: ',lIndex); 
    } 
    console.log('End Loop - mIndex: ',mIndex,' rIndex: ',rIndex, ' lIndex: ',lIndex); 
    while(lIndex<left.length){ 
     mergeInto[mIndex] = left[lIndex]; 
     lIndex++; 
     mIndex++; 
    } 
    while(rIndex<right.length){ 
     mergeInto[mIndex] = right[rIndex]; 
     rIndex++; 
     mIndex++; 
    } 
    console.log('Merge complete: mergeInto: ',mergeInto, ' left: ',left, ' right: ',right); 
    resolve(mergeInto); 
    }); 
}; 

mergesortAsync(inputArr).then(results => console.log('Sorted result: ',JSON.stringify(result))) 
.catch(error => console.log('Error: ',error)); 
+0

避免['Promise'構造反模式](http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-反模式和如何對避免-吧)! – Bergi

+1

WTH是否使用承諾?代碼中沒有任何異步。 – Bergi

+0

你有一個同步的例子嗎? – user257543

回答

1

它永遠不會停止,當陣列下面長度分割的2

是向下遞歸 - 因爲resolve不是return,它不會停止你的函數的執行。二者必選其一

if (input.length < 2) { 
    … 
} else { 
    … 
} 

if (input.length < 2) { 
    … 
    return; 
} 
… 
+0

謝謝,我沒有意識到! – user257543