我有以下:這個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;
}
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
陣列進行了排序之後。我想我錯過了遞歸退出條件,但我不知道在哪裏。
您是否嘗試過手動排序列表(手工)並查看「交換」日誌行是否匹配。也許你可以給代碼添加一些註釋(例如爲什麼你有兩個幾乎相同的if嵌套?)。 – Lycha
@Lycha,是的,交換週期匹配。當我們到達'if(l <= r)'條件時,這意味着我們在'l'eft側有一個大於分隔元素'm'的元素。同樣,我們也有一個小於'm'的元素'r'。因此,我們交換它們,除非它們相等,並增加(和減少)走廊邊緣。 – Lapple