Javascript 这种快速排序实现有什么问题?
我有以下资料:Javascript 这种快速排序实现有什么问题?,javascript,sorting,computer-science,quicksort,Javascript,Sorting,Computer Science,Quicksort,我有以下资料: function quickSort(array, low, high) { var len = array.length, l = low || 0, r = high || len - 1, m = Math.round((l + r) / 2), t; do { while (array[l] < array[m]) { l += 1;
function quickSort(array, low, high) {
var len = array.length,
l = low || 0,
r = high || len - 1,
m = Math.round((l + r) / 2),
t;
do {
while (array[l] < array[m]) {
l += 1;
}
while (array[r] > array[m]) {
r -= 1;
}
if (l <= r) {
if (l < r) {
t = array[r];
array[r] = array[l];
array[l] = t;
console.log('Swapped ' + array[r] + ' with ' +
array[l] + '. ' +
array);
}
l += 1;
r -= 1;
}
} while (l <= r);
if (r > 0) quickSort(array, 0, r);
if (l < len - 1) quickSort(array, l, len - 1);
}
令人惊讶的是,在数组排序后,代码抛出堆栈溢出。我想我错过了递归退出条件,但我不知道在哪里。编辑(替换以前的答案):我认为这里的问题是设置len
变量的方式。对于就地排序,len
应仅为正在排序的数组部分的长度,而不是整个数组的长度,否则最后的比较结果将永远不会为false。因此,不是:
var len = array.length,
l = low || 0,
r = high || len - 1;
您需要根据l
和r
设置len
:
var l = low || 0,
r = high || array.length - 1,
len = r-l;
您可以在这里看到正在工作的JSFIDLE:-我用一个随机数组替换了您的测试数据进行测试。您是否尝试手动(手动)对列表进行排序,并查看“交换”的日志行是否匹配。也许您可以在代码中添加一些注释(例如,为什么嵌套了两个几乎相同的if?。@Lycha,是的,交换周期匹配。当我们到达如果(l不,在这种情况下,数组的右边部分根本不会被排序-在do…的末尾,
循环l
将等于m-1
或m
。你可以在你提供的小提琴中检查它-部分排序的数组在9后有8个。@Honneykeepa-你是对的,先生。我再拿一个看看这个-我确实认为这就是逻辑关闭的地方。@Honneykeepa-看看我更新的回答。逻辑关闭了,但这是因为len
是如何设置的,而不是你在比较什么。这绝对是一个改进!Upvote。但是,函数没有对数组进行适当排序。@nrabinowitz,谢谢你的时间还有帮助。诅咒,你又对了。这将成为快速排序的速成课程。我再看一看。(出于好奇,你知道array.sort()
可能会快得多,对吧?)
var l = low || 0,
r = high || array.length - 1,
len = r-l;