2013-08-12 126 views
3

的src/QuickSort.js的RangeError:最大調用堆棧大小使用Array.forEach

var quick_sort = function(unsorted) { 
    if (unsorted.size <= 1) 
    return unsorted; 

    var pivot = unsorted.pop(); 
    var less = new Array(); 
    var greater = new Array(); 

    unsorted.forEach(function(element){ 
    if (element > pivot) 
     less.push(element); 
    else 
     greater.push(element); 
    }); 

    return quick_sort(less) + [pivot] + quick_sort(greater); 
}; 

規格/ QuickSort.js超過

describe("#quick_sort", function() { 

    it("should sort the unsorted array", function() { 
    var unsorted = [8, 2, 10, 5, 4, 9, 7, 1, 6, 3]; 
    var sorted = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
    expect(quick_sort(unsorted)).toEqual(sorted); 
    }); 

}); 

錯誤消息

RangeError: Maximum call stack size exceeded 
    at Array.forEach (native) 
    at quick_sort (file://localhost/Users/jasonkim/projects/algorithm-everyday/quick_sort/javascript/src/QuickSort.js:9:12) 
    at quick_sort (file://localhost/Users/jasonkim/projects/algorithm-everyday/quick_sort/javascript/src/QuickSort.js:16:10) 

我想用jasminejs測試快速排序功能。我收到上面的錯誤。我的終止條件高於if (unsorted.size <= 1) { return unsorted }。我不知道爲什麼它沒有終止並進入無限循環。

+1

不知道jasmine.js,確實'unsorted.size'實際上意味着'unsorted.length'?另外,數組上的'+'運算符在純JS中看起來並不那麼有效。 – Passerby

+0

@帕瑟比,謝謝!將其作爲答案,我會接受它。 Ruby語法正在接近我。 –

回答

4

你的問題是該行

if (unsorted.size <= 1) return unsorted;

,它們不會達到爲數組沒有名爲size原型屬性, 因此你不要返回數組時unsorted是空的,因此進入一個無限循環,調用quick_sort和一個空的unsorted,直到調用堆棧耗盡。

你正在尋找的屬性爲Array.prototype.length,如果你想行改爲

if (unsorted.length <= 1) return unsorted;

您函數將返回正確的,如果它獲得通過一個空數組。

但是那裏有一個小東西,可也注意到,

return quick_sort(less) + [pivot] + quick_sort(greater);

如果你期待返回一個級聯分類數組,你就必須改變這一行了。

通過使用+操作,這就要求你不能簡單地串聯陣列,

[[toPrimitive]][[toString]]lRefrRef導致您的陣列的連接字符串表示。

這將(因爲你是effectivley +「荷蘭國際集團所有樞軸陣列,包含單個元素)在類似10987654321,而不是[10,9,8,7,6,5,4,3,2,1]你可能實現的。

改爲使用連接數組的Array.prototype.concat

return quick_sort(less).concat([pivot]).concat(quick_sort(greater));

這裏是一個Fiddle

+0

謝謝你。真棒回答。 –

+0

@JasonKim謝謝,不客氣=) – C5H8NNaO4

相關問題