Javascript + Quicksort:这个维基百科的实现如何运作?

时间:2014-12-29 01:18:30

标签: javascript

我试图提升我的javascript +算法游戏。我正在维基百科上看这个快速排序实现:http://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#JavaScript

function qsort(a) {
  if (a.length == 0) return [];

  var left = [], right = [], pivot = a[0];

  for (var i = 1; i < a.length; i++) {
    a[i] < pivot ? left.push(a[i]) : right.push(a[i]);
  }

  return qsort(left).concat(pivot, qsort(right));
}

我理解这个概念。它将原始数组递归地分解为较小的部分并对较小的数组进行排序。但是,当它永远不会返回左/右数组(类似qsort)时,我不知道这个return leftArrayResult;函数是如何工作的。这是不是说qsort总是返回null或空数组?因此qsort(left).concat(pivot, qsort(right)永远是null.concat(pivot, null),因此永远不会有效?

1 个答案:

答案 0 :(得分:2)

如果我们有未分类的[6,10,4,1]

第一阶段:

qsort[6,10,4,1];

pivot = 6;

在for循环中,每次循环编号为:

  1. 10 > 6,添加到右侧数组
  2. 4 < 6,已添加到左侧数组
  3. 1 < 6,已添加到左侧数组
  4. left = [4,1]; right = [10]; pivot = 6;

    然后再次在左侧数组上递归调用

    qsort,即[4,1]

    第二阶段:

    pivot = 4

    在for循环中,每次循环编号为:

    1. 1 < 4,已添加到左侧数组
    2. left = [1]; right = []; pivot = 4;

      然后递归调用qsort,再次在左侧数组中调用[1]

      第三阶段:

      pivot = 1

      不执行for循环。

      left = []; right = []; pivot = 1;

      在左侧数组上调用qsort。

      第四阶段:

      这次qsort返回一个空数组。

      执行现在转移到第三个堆栈中的concat调用,获取空数组并将其连接为1,qsort(right)的结果也将返回一个空数组。所以现在返回的值是[1]

      执行现在回到第二阶段,其中[1]连接到4的枢轴和qsort([])的结果,所以我们现在返回值为[1,4]

      执行现在返回到第一阶段,因此我们将[1,4]的结果连接到6的轴和qsort([10])的结果,以获得[1,4,6,10]的结果。

      我希望这很容易理解!