在这种情况下递归如何工作?
|
var arr = [7,3,28,8,9,13,1500,45];
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));
}
alert(qsort(arr));
该例程使用Quicksort算法对数组进行排序。
问题是基本情况ѭ1将如何成立才能停止递归?
没有找到相关结果
已邀请:
7 个回复
喷乡顾沥沪
当length为0时停止。
挂帘妈乡
芦歉竭皑
是数组中的第一项
是低于
的物品
是高于
的物品 所以第一次有
:
现在在the4ѭ和
数组上递归调用
。 让我们看一下
,那么so14ѭ:
再次,在“ 4”和“ 6”数组上递归调用“ 10”。 再次让我们看一下
,所以so20ѭ:
的第一件事是什么?
如果它接收到一个空数组(在此执行此操作),它将仅返回一个空数组,从而停止该分支上的执行。 因为每次调用“ 10”都会从数组中弹出第一项,所以每次调用“ 10”时,接收到的数组会越来越短,直到将一个空数组发送到“ 10”。 另一种思考方式: 可能令人困惑的部分是,“ 10”将第一个项目剔除,然后将数组的其余部分分为2个部分。 试想一下,如果它没有拆分数组,而是将第一个项目删除了。 该函数实际上没有做任何事情,只是用Array的其余部分递归地调用自身。
因此,当您调用该函数时,将发生以下情况:
函数中发生了完全相同的事情,除了递归地传递\“ tail \”而不是\“ head \”和\“ tail \”之外,您得到的是\“ head \”(
)和一个\“ tail \”,它分为2个数组(
和
)。 尾巴的两个部分都发送给递归调用,将其头部弹出,将其余部分拆分,然后再次进行,直到没有剩余。
春驹晴陪
因此,现在我们将其分成了半数次,并解决了所有这些问题,我们可以将它们合并在一起。 这行:
说“把左边的子问题和右边的子问题粘在一起,这就是我的答案”。 这种气泡上升到顶部,将所有不同的子数组粘在一起,并生成带有答案的数组。 比这要复杂一点,但是无论如何这都是递归的。
绵扇寸访
更改为
,将
更改为
,将
更改为
。 虽然连接可能很难遵循,但是它很好地显示了流程。
要进行串联,基本上是从根开始,尽可能远地深入the35,直到无法深入为止。 然后回溯,记下您最近通过的
,并按照其
分支以及您可以做的所有
分支。 重复此过程,始终偏爱
分支,并在回溯时通过
。 这将为您提供完全排序的数组。
辅奈
珊畴炮贩号
是串联
最终成为
b是枢轴,而a(左)和c(右)都经过另一个快速排序迭代。这会在两者的每一边加一个“ 52”,然后将所有三个连接在一起。