2013-08-12 125 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

相关问题