我看到这个视频解释了 JavaScript 中的合并排序 https://www.youtube.com/watch?v=ppNZ4bmrmGs&t=195s
据我所知,slice() 方法选择从给定起始参数开始到给定结束参数结束的元素,但不包括。那么,当这个人尝试为存储索引 0 到结束参数的子数组创建一个变量时,它怎么会包含结束参数呢? :
const leftSide = array.slice(0, middle);
const rightSide = array.slice(middle, array.length);
这是其余的代码:
const mergeSort = array => {
//Check if array can be split
if(array.length < 2) return array;
//Get Middle index
const middle = Math.floor(array.length / 2);
//Split Array In Two Sides
const leftSide = array.slice(0, middle);
const rightSide = array.slice(middle, array.length);
//Use recusion to continue splitting
console.log('split:', leftSide, rightSide);
return merge(mergeSort(leftSide), mergeSort(rightSide));
}
const merge = (left, right) => {
//Create New Array
const result = [];
//Check if left array and right array is empty
while(left.length && right.length) {
//Find lower value
if(left[0] <= right[0]) {
//Add left value
result.push(left.shift());
} else {
//Add right value
result.push(right.shift());
}
}
//Merge left array
while(left.length) result.push(left.shift());
//Merge right array
while(right.length) result.push(right.shift());
//return result array
console.log('result:', result);
return result;
}
console.log(mergeSort([5, 3, 7, 10, 4, 1, 5]));
最佳答案
在大多数编码语言中,索引从 0 开始的结果是,您可以通过获取索引小于 n 的所有元素来访问前 n 个元素。大多数编码语言的机制都遵循这一点,例如 splice
等函数的包含-独占属性。看看你的测试数组是如何分割的:
5 3 7 10 4 1 5
对于偶数长度的列表,分成 2 份很简单;两侧的长度相同。对于奇数长度列表,您必须选择左侧更大还是右侧更大,在此实现中选择了右侧(因此使用了 floor
)。长度为7,因此middle
设置为floor(7/2)=3。这意味着分割的左侧长度应为 3(因此 5 3 7
),右侧长度应为 4。如果计算索引,您会发现 7
有索引2
。因此,如果您从 0
到 3
包含-排除分区,则包含直到第三个元素或第二个索引的所有内容,这正是所需的。
关于javascript - 为什么 slice 方法在此代码中包含 end 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61241965/