我一直在尝试实现quickSort函数并使所有工作正常。但是有一个特殊之处,我无法缠住头或无法理解原因。
在第一段代码中,您将看到我已经为quickSort()
函数声明了一些默认参数值:
function swap(arr, firstIndex, secondIndex) {
let temp = arr[firstIndex];
arr[firstIndex] = arr[secondIndex];
arr[secondIndex] = temp;
}
function pivot(arr, start = 0, end = arr.length - 1) {
// We are assuming that the pivot is always the first element
let pivot = arr[start];
let swapIndex = start;
for (let i = start + 1; i <= end; i++) {
if (pivot > arr[i]) {
swapIndex++;
swap(arr, swapIndex, i);
}
}
// Swap the starting element with the pivot index
swap(arr, start, swapIndex);
return swapIndex;
}
function quickSort(arr, left = 0, right = arr.length - 1) {
if (left < right) {
let pivotIndex = pivot(arr, left, right);
// left
quickSort(arr, left, pivotIndex - 1);
// right
quickSort(arr, pivotIndex + 1, right);
}
return arr;
}
在此示例中,它按预期工作。但是,如果我要从quickSort()
中删除ES2015默认参数值,而是在函数内部创建默认值,如下所示:
function quickSort(arr, left, right) {
left = left || 0;
right = right || arr.length -1;
if (left < right) {
let pivotIndex = pivot(arr, left, right);
// left
quickSort(arr, left, pivotIndex - 1);
// right
quickSort(arr, pivotIndex + 1, right);
}
return arr;
}
我遇到无限循环/堆栈溢出的问题,我不明白为什么。据我所知,问题是由第三个参数-right
-而非左参数引起的,因为如果我使用pre-es2015方法调用左参数,而保留right
参数,则代码可以正常工作使用ES2015参数默认方法。
总而言之,我的代码在工作,所以很好-我只是想尝试并更好地理解为什么这会导致问题,因为我之前从未遇到过这样的问题。
谢谢!
问题是当0
作为right
传递时,您的两个版本的工作方式不同。 (并且因为这是一个基本情况,所以会出现无限循环)。
right = right || arr.length -1;
[传入0
时评估为右侧,因为0
虚假。
另一方面,如果传递了0
,则默认参数初始化程序会将right
放入0
,并在arr.length - 1
(或完全没有自变量)为通过。要复制该行为,请在ES5中编写
undefined