Javascript 合并排序:合并函数数组索引零返回多个索引

Javascript 合并排序:合并函数数组索引零返回多个索引,javascript,arrays,sorting,merge,mergesort,Javascript,Arrays,Sorting,Merge,Mergesort,我想用Javascript实现合并排序作为一种学习体验。我有一个函数mergeSort(unsortedArray),它接受一个未排序的数组,并使用合并排序策略对其进行排序。mergeSort()调用merge(leftArray,rightArray),它将两个已排序的数组合并在一起,生成一个已排序的数组 我认为问题在于merge()函数。在数组[8,8,7,5,4,6,3,2,1,5,9,8,7,6,5,4,2,3,6,5,4,8]上调用mergeSort时,我得到的结果是:[1,4,2,3

我想用Javascript实现合并排序作为一种学习体验。我有一个函数mergeSort(unsortedArray),它接受一个未排序的数组,并使用合并排序策略对其进行排序。mergeSort()调用merge(leftArray,rightArray),它将两个已排序的数组合并在一起,生成一个已排序的数组

我认为问题在于merge()函数。在数组[8,8,7,5,4,6,3,2,1,5,9,8,7,6,5,4,2,3,6,5,4,8]上调用mergeSort时,我得到的结果是:[1,4,2,3,5,5,9,6,7,8,8]。据我所知,问题的根源在于,在merge()函数中,在比较leftArray[0]和rightArray[0]时,rightArray[0]有时会返回多个值,而不仅仅是第一个索引。在我的例子中,它是用2,3和5,9来做的。因此,当代码运行时,有时rightArray[0]=2,3,在将2,3从数组拼接后,rightArray[0]=5,9。出现此问题时,merge()中会发生以下情况:

步骤1 leftArray:[4,5,6,7,8,8]
rightArray:[1,2,3,5,9]
结果:[]

步骤二 leftArray[4,5,6,7,8,8]
rightArray[2,3,5,9]
结果:[1]

步骤三 (索引不正确…数组[0]返回两个值)
leftArray[0]=4
rightArray[0]=2,3

leftArray[5,6,7,8,8]
rightArray[2,3,5,9]
结果[1,4]

步骤四 (索引不正确…数组[0]返回两个值)
leftArray[0]=5
rightArray[0]=2,3

leftArray[5,6,7,8,8]
rightArray[5,9]
结果[1,4,2,3]

…数组[0]索引再次拧紧,然后返回rightArray[0]=5,9。奇怪的是,如果我在leftArray=[4,5,6,7,8,8]和rightArray[1,2,3,5,9]独立于mergeSort()调用我的merge()函数,它工作正常并返回正确的结果,而没有奇怪的索引行为

//实现合并排序。。。
函数mergeSort(unsortedArray){
var leftArray=[];
var rightArray=[];
var结果=[];
//一个元素的基本情况
if(unsortedArray.length 0&&rightArray.length>0){
//比较两个列表的第一项
//警报(“while循环顶部”);
//警报(“leftArray[0]=”+leftArray[0]+“rightArray[0]=”+rightArray[0]);
if(leftArray[0]>=rightArray[0]){
result.push(rightArray[0]);
//警报(“推送rightArray[0]后的结果”+result+”和拼接前的rightArray:“+rightArray”);
右阵列拼接(0,1);
//警报(“splce后的rightArray:+rightArray”);
}
否则{
result.push(leftArray[0]);
//警报(“推送leftArray[0]后的结果”+result+”和拼接前的leftArray:“+leftArray”);
leftArray.拼接(0,1);
//警报(“splce后的leftArray:+leftArray”);
}
}
//警报(“在leftArray添加之前”);
如果(leftArray.length>0){
//警报(“进入左数组>0左数组:“+leftArray”);
结果.推送(左数组);
}
//警报(“在rightArray添加之前”);
如果(rightArray.length>0){
//警报(“进入右数组>0右数组:+rightArray”);
结果:推送(右数组);
}
//警报(“合并函数中的结果:+结果”);
返回结果;
}
//测试用例
var unsortedArray=[8,8,7,5,4,6,3,2,1,5,9,8,7,6,5,4,2,3,6,5,4,8];
var sortedArray=合并排序(unsortedArray);
lert(Darray);
//问题是当合并排序有下面描述的左数组和右数组时
//merge函数将在左数组和右数组上产生正确的结果
//如果按下面的方式直接调用,则在通过
//使用leftArray和rightArray合并排序,如下所述
//结果如下
var leftArray=[4,5,6,7,8,8];
var rightArray=[1,2,3,5,9];
var ImproverResult=[1,4,2,3,5,5,9,6,7,8];
var resultAct=merge(leftArray,rightArray);
警惕(resultAct)
合并排序问题
您需要使用而不是
.push()
到concat 2
数组。

.concat
组合2个(或更多)数组并返回一个新的
数组
,而只将目标推到
数组
的末尾,它不会为您压缩数组

如果您记录原始结果而不是警报,您将看到

[1,2,3,4,4,数组[2],5,数组,数组[2],数组,数组[2], 数组[4]]

很明显,您只是将数组推送到了结果中

所以在你的

if(leftArray.length > 0){
    result.push(leftArray);
}
if(rightArray.length > 0){
    result.push(rightArray);
}
你应致函:

if(leftArray.length > 0){
    result = result.concat(leftArray);
}
if(rightArray.length > 0){
  result = result.concat(rightArray);
}
函数合并排序(unsortedArray){
var leftArray=[];
var rightArray=[];
var结果=[];
//一个元素的基本情况
if(unsortedArray.length 0&&rightArray.length>0){
//比较两个列表的第一项
if(leftArray[0]>=rightArray[0]){
result.push(rightArray[0]);
右阵列拼接(0,1);
}
否则{
result.push(leftArray[0]);
leftArray.拼接(0,1);
}
}
如果(leftArray.length>0){
结果=result.concat(leftArray);
}
如果(rightArray.length>0){
结果=result.concat(rightArray);
}
返回结果;
}
//测试用例
var unsortedArray=[8,8,7,5,4,6,3,2,1,5,9,8,7,6,5,4,2,3,6,5,4,8];
var sortedArray=合并排序(unsortedArray);
警报(Darray);
//问题是当合并排序有下面描述的左数组和右数组时
//merge函数将在左数组和右数组上产生正确的结果
//如果按下面的方式直接调用,则在通过
//使用leftArray和rightArray合并排序,如下所述
//结果如下
var leftArray=[4,5,6,7,8,8