我正在尝试在JavaScript中实现quicksort函数:
function partition(l, low, high) {
l[0] = l[low];
var pivotkey = l[low];
while (low < high) {
while (low < high && pivotkey <= l[high]) {
--high;
}
l[low] = l[high];
while (low < high && l[low] <= pivotkey) {
++low;
}
l[high] = l[low];
}
l[low] = l[0];
return low;
}
function qsort(l, low, high) {
var pivotloc;
if (low < high) {
pivotloc = partition(l, low, high);
qsort(l, low, pivotloc - 1);
qsort(l, pivotloc + 1, high);
}
return;
}
function quickSort(l) {
qsort(l, 1, l.length - 1);
return l;
}
console.log(quickSort([0, 1, 4, 3]));
但是这个程序在终端中没有输出任何东西(node qsort.js
)。也许我错过了一些东西。谁能指出我正确的方向?如何调试这类问题?
答案 0 :(得分:1)
正如你所说,数组的第一个元素将被用作一个临时变量,它只对算法的执行有用,而且一开始并不清楚!
您的算法运行正常,但打印结果时遇到问题!
要获得您想要的内容,您需要通过在shift()
块中添加quickSort()
函数来删除第一个元素,以便它变为:
function quickSort(l) {
qsort(l, 1, l.length - 1);
l.shift(); // add this function
return l;
}
如果你想使用splice()
函数删除第一个元素并且具有以下形式,还有另一个解决方案:
array.splice(indexToRemove, numberToRemove);
所以要获得所需的resutl,请将上面的说明添加到quickSort()
函数中,如下所示:
function quickSort(l) {
qsort(l, 1, l.length - 1);
l.splice(0, 1); //add this line
return l;
}
这是我猜你的问题的两个解决方案。希望它有所帮助!!
答案 1 :(得分:0)
我相信您的算法存在一些问题。但我能立即注意到的一个问题与您在l.low
函数中使用l.high
和partition
有关。我假设l
是一个数组,在这种情况下,这两个数据都旨在访问low
和high
的索引。如果属于这种情况,则应为l[low]
和l[high]
。
由于您似乎正在尝试进行快速排序的就地版本,请查看此处提供的内容:In Place Quick Sort