我试图提升我的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)
,因此永远不会有效?
答案 0 :(得分:2)
如果我们有未分类的[6,10,4,1]
,
第一阶段:
qsort[6,10,4,1];
pivot = 6;
在for循环中,每次循环编号为:
10 > 6
,添加到右侧数组4 < 6
,已添加到左侧数组1 < 6
,已添加到左侧数组 left = [4,1]; right = [10]; pivot = 6;
qsort,即[4,1]
。
第二阶段:
pivot = 4
在for循环中,每次循环编号为:
1 < 4
,已添加到左侧数组 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]
的结果。
我希望这很容易理解!