4

src/快速排序.js

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 }。我不确定为什么它没有终止并进入无限循环。

4

1 回答 1

6

你的问题是线路

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

由于数组没有名为的原型属性,因此永远不会到达size,因此当数组为空时不会返回数组unsorted,因此进入无限循环,使用空调quick_sortunsorted直到调用堆栈耗尽。

您要查找的属性是Array.prototype.length,如果您将行更改为

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

如果传递了一个空数组,您的函数将正确返回。

不过也有一点可以注意到,

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

如果您希望返回一个串联的排序数组,您也必须更改此行。

您不能简单地使用+运算符连接 Array,该运算符调用,

[[toPrimitive]][[toString]]lRefrRef导致您的数组的串联字符串表示。

哪个会(因为您正在有效地+使用所有枢轴数组,包含单个元素)10987654321,而不是您[10,9,8,7,6,5,4,3,2,1]可能实现的目标。

而是使用Array.prototype.concatwhich 连接数组。

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

这是一个小提琴

于 2013-08-12T07:42:02.820 回答