合并排序的JS范围请帮助我理解
JS scope for merge sorting please help me understnad
有人可以帮我理解为什么第一段代码有效而第二段代码无效吗?试图解决按顺序合并到数组的问题。第一个是解决方案代码,第二个是我想出的代码。
我无法理解为什么 i 变量似乎停留在工作循环中的循环中,但在我的代码中,当尝试在 while 循环中使用它时,arr1Item 似乎消失了?
const gerry = [0,3,4,31]
const machmoud = [4,6,30]
const mergeSort = (arr1, arr2) => {
const mergedArr = [];
//init Counters
let i= 1
let j= 1
let arr1Item = arr1[0]
let arr2Item = arr2[0]
while(arr1Item || arr2Item){
if(arr1Item < arr2Item || !arr2Item){
mergedArr.push(arr1Item)
arr1Item = arr1[i]
i++
}
else{
mergedArr.push(arr2Item)
arr2Item = arr2[j]
j++
}
}
return mergedArr
}
console.log(mergeSort(gerry, machmoud))
第二组代码
const gerry = [0,3,4,31]
const machmoud = [4,6,30]
const mergeSort = (arr1, arr2) => {
const mergedArr = [];
//init Counters
let i= 0
let j= 0
let arr1Item = arr1[j]
let arr2Item = arr2[i]
while(arr1Item || arr2Item){
if(arr1Item < arr2Item || !arr2Item){
mergedArr.push(arr1Item)
i++
}
else{
mergedArr.push(arr2Item)
j++
}
}
return mergedArr
}
console.log(mergeSort(gerry, machmoud))
这会进入无限循环。
您的代码(第二块)的主要问题是循环永远不会更新 arr1Item
和 arr2Item
的值,因此 while
条件永远无法计算为除了它第一次做的任何事情。因此你会得到一个无限循环。所以一旦你改变 i
或 j
应该也应该从数组中读取相应的值到相关变量中。
但是,这两种实现方式都存在一个问题。如果他们得到两个数组的第一个数组值都是 0,或者即使只有第二个数组以 0 开头,结果也不会像预期的那样。你真的应该与 undefined
进行比较。这是您更正的代码:
const gerry = [0, 3, 4, 31];
const machmoud = [4, 6, 30];
const mergeSort = (arr1, arr2) => {
const mergedArr = [];
//init Counters
let i = 0;
let j = 0;
let arr1Item = arr1[i];
let arr2Item = arr2[j];
while (arr1Item !== undefined || arr2Item !== undefined) {
if (arr1Item < arr2Item || arr2Item === undefined) {
mergedArr.push(arr1Item);
i++;
arr1Item = arr1[i];
} else {
mergedArr.push(arr2Item);
j++;
arr2Item = arr2[j];
}
}
return mergedArr;
}
console.log(mergeSort(gerry, machmoud));
有人可以帮我理解为什么第一段代码有效而第二段代码无效吗?试图解决按顺序合并到数组的问题。第一个是解决方案代码,第二个是我想出的代码。 我无法理解为什么 i 变量似乎停留在工作循环中的循环中,但在我的代码中,当尝试在 while 循环中使用它时,arr1Item 似乎消失了?
const gerry = [0,3,4,31]
const machmoud = [4,6,30]
const mergeSort = (arr1, arr2) => {
const mergedArr = [];
//init Counters
let i= 1
let j= 1
let arr1Item = arr1[0]
let arr2Item = arr2[0]
while(arr1Item || arr2Item){
if(arr1Item < arr2Item || !arr2Item){
mergedArr.push(arr1Item)
arr1Item = arr1[i]
i++
}
else{
mergedArr.push(arr2Item)
arr2Item = arr2[j]
j++
}
}
return mergedArr
}
console.log(mergeSort(gerry, machmoud))
第二组代码
const gerry = [0,3,4,31]
const machmoud = [4,6,30]
const mergeSort = (arr1, arr2) => {
const mergedArr = [];
//init Counters
let i= 0
let j= 0
let arr1Item = arr1[j]
let arr2Item = arr2[i]
while(arr1Item || arr2Item){
if(arr1Item < arr2Item || !arr2Item){
mergedArr.push(arr1Item)
i++
}
else{
mergedArr.push(arr2Item)
j++
}
}
return mergedArr
}
console.log(mergeSort(gerry, machmoud))
这会进入无限循环。
您的代码(第二块)的主要问题是循环永远不会更新 arr1Item
和 arr2Item
的值,因此 while
条件永远无法计算为除了它第一次做的任何事情。因此你会得到一个无限循环。所以一旦你改变 i
或 j
应该也应该从数组中读取相应的值到相关变量中。
但是,这两种实现方式都存在一个问题。如果他们得到两个数组的第一个数组值都是 0,或者即使只有第二个数组以 0 开头,结果也不会像预期的那样。你真的应该与 undefined
进行比较。这是您更正的代码:
const gerry = [0, 3, 4, 31];
const machmoud = [4, 6, 30];
const mergeSort = (arr1, arr2) => {
const mergedArr = [];
//init Counters
let i = 0;
let j = 0;
let arr1Item = arr1[i];
let arr2Item = arr2[j];
while (arr1Item !== undefined || arr2Item !== undefined) {
if (arr1Item < arr2Item || arr2Item === undefined) {
mergedArr.push(arr1Item);
i++;
arr1Item = arr1[i];
} else {
mergedArr.push(arr2Item);
j++;
arr2Item = arr2[j];
}
}
return mergedArr;
}
console.log(mergeSort(gerry, machmoud));