Javascript + Quicksort:这个维基百科实现是如何工作的
Javascript + Quicksort: how does this wikipedia implementation work?
我正在尝试提升我的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));
}
我理解这个概念。它以递归方式将原始数组分解为较小的部分,并对较小的数组进行排序。但是,当它从不返回左/右数组(类似于 return leftArrayResult;
)时,我看不出这个 qsort
函数是如何工作的。这是否意味着 qsort 总是返回null
或空数组?所以qsort(left).concat(pivot, qsort(right)
总是null.concat(pivot, null)
,因此永远不会起作用?
如果我们有未排序的[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]
的结果。
我希望这很容易理解!
- 如何使用动画实现纸张推车
- 客户端服务器REST API captcha实现
- 如何实现此布局
- Meteor忘记了密码的实现
- 使用Native Sockets在Android中实现WebSockets
- 在样板文件中实现Ajax
- instanceof是如何在JavaScript中实现的
- 如何正确实现Jquery多选小部件
- 实现一个建立在google.com之上的自定义搜索引擎
- 多个组件是如何实现的
- window.location使用jquery mobile实现chrome跳转
- 如何在OpenERP中实现网络摄像头
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- javascript加密实现,包括可信否认
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- 如何让程序员在javascript中实现正确的回调
- 如何使用自定义辅助对象(handler)实现嵌套的每个循环
- AngularJS智能表全局配置实现
- Expressjs/AngularJS:实现req-flash后出错
- Javascript + Quicksort:这个维基百科实现是如何工作的