我正在尝试使用Javascript编写排序算法。伪代码在我的链接中。这是我的Go Playground链接。 http://play.golang.org/p/wQwO6Wvd7b
如您所见,它适用于其他语言。 (我尝试使用Python,C,C ++,Ruby,Go使用相同的代码,它们都完美无缺。)所以我使用Javascript做了完全相同的事情,但它不起作用,我无法弄清楚为什么。感谢Chris在我之前发布的帖子:Javascript Sorting. Allocation fail process out of memory error
我发现我的Javascript中的代码超出了递归的索引限制,但我不知道为什么以及如何在Javascript中实现,而其他语言只是在我的代码中做正确的工作。 我肯定遗漏了Javascript和递归中的一些基本信息。任何人都可以帮我解决一下吗? (不是家庭作业,只是独立自学)我对Javascript很新。
我不认为我需要在Javascript中进行排序,但我想知道我做错了什么。
以下是我的代码,用于错误检查。
var arr = [-1, 5, 7, 4, 0, 1, -5];
console.log("Unsorted Array:", arr);
console.log("# of elements in array:", arr.length)
function Partition(arr, first_index, last_index) {
console.log("---")
console.log("# of elements in array:", arr.length)
console.log("First index is", first_index);
console.log("Last index is", last_index);
console.log("---")
var x = arr[last_index];
var i = first_index - 1;
for (var j = 0; j < arr.length-1; j++) {
if (j > 100) {
console.log("Looping way too much.");
return;
}
if (arr[j] <= x) {
i += 1;
console.log("Swap index:", i, j);
var temp_1 = arr[i];
arr[i] = arr[j];
arr[j] = temp_1;
}
}
console.log("Swap index:", (i+1), last_index);
var temp_2 = arr[i+1];
arr[i+1] = arr[last_index];
arr[last_index] = temp_2;
return i+1;
}
function QSort(arr, first_index, last_index) {
console.log("QuickSort index:", first_index, last_index);
if (first_index < last_index) {
var mid = Partition(arr, first_index, last_index);
QSort(arr, first_index, mid-1);
QSort(arr, mid+1, last_index);
}
}
QSort(arr, 0, arr.length-1);
console.log("Sorted Array:", arr);
而且我在猜测为什么这个循环太多了。 我发现我在递归时做错了。
数组中的元素数量:8
第一个指数是2
最后一个指数是6
掉期指数:2 0
交换指数:3 2
交换指数:4 3
交换指数:5 4
交换指数:6 5
掉期指数:7 6
掉期指数:8 6
QuickSort指数:2 7
数组中的元素数量:9
第一个指数是2
最后一个指数是7
等等
答案 0 :(得分:1)
我不知道这在其他语言中是如何工作的,因为这是错误的。分区方法中的循环可以在整个数组上运行,实际上它应该仅仅处理它被告知要处理的部分(在first_index和last_index之间)
这行代码:
for (var j = 0; j < arr.length-1; j++)
应该是:
for (var j = first_index; j < last_index; j++)
答案 1 :(得分:1)
Partition
函数内的for循环应写为:
for (var j = first_index; j < last_index; j++) {...}
而不是
for (var j = 0; j < arr.length-1; j++) {...}
从0
循环到arr.length-1
会使其在原始数组中创建新元素,而不是仅仅交换它们。
答案 2 :(得分:0)
SPOILER ALERT - 这个小提琴有一个快速排序的工作版本。我有点挣扎你的版本,所以我写了自己的。
像quicksort这样的算法为错误提供了很多机会(很多地方可以被一个人关闭等)
作为一般性建议,您可能想要通过传递数组来调用快速方法:
function quick_sort(array) {
qsort(array, 0, array.length);
console.log(array);
}
希望这有帮助