【发布时间】:2011-12-14 08:06:10
【问题描述】:
我有以下几点:
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);
}
如下使用:
var initial = [1, 8, 9, 0, 2, 5, 6, 7, 3, 4, 10], // Duplicate, just to compare
sorted = [1, 8, 9, 0, 2, 5, 6, 7, 3, 4, 10];
quickSort(sorted);
console.log('Initial: ' + initial + '\nSorted: ' + sorted);
令人惊讶的是,代码在数组排序后抛出stack_overflow。我想我错过了递归退出条件,但我不知道在哪里。
【问题讨论】:
-
您是否尝试过手动(手动)对列表进行排序并查看“已交换”日志行是否匹配。也许您可以在代码中添加一些 cmets(例如,为什么您有两个几乎相同的 if 嵌套?)。
-
@Lycha,是的,交换周期匹配。当我们到达
if (l <= r)条件时,这意味着我们在left 一侧有一个大于分隔元素m的元素。同样,我们还有一个小于m的元素r。因此,我们交换它们,除非它们相等并增加(和减少)走廊边距。
标签: javascript sorting computer-science quicksort