经典面试题,将两个有序数组合并为一个有序数组。
实现思路
(1)while循环遍历两个数组(不破坏原数组,生成新数组)。
直到两个数组的计算的索引(i与j),其中任何一个大于自身数组的长度,终止循环
。
(2)正对比,错位对比。
因为两个数据都是有序的。故,只需按照元素值对比大小,然后取最大的值即可;
如果其中一个数组索引的元素值,小于另外一个数组索引的元素值,将最小的值放到newArr中;
并叠加最小值的索引值(列i++);
(3)元素值有3个对比(小于、大于、等于)。
小于,取小于的元素值,叠加小于的索引;
大于,取小于的元素值,叠加小于的索引;
等于,两个元素值都取,同时叠加两个索引;
代码
方法1
做递增标识i,j,不会对原数组产生影响。
function mergeSort(arr1, arr2) {
var [i,j] = [0,0];
let newArr = [];
while(i < arr1.length || j <arr2.length) {
if (arr1[i] < arr2[j]) {
newArr.push(arr1[i]);
i++
} else if (arr1[i] > arr2[j]) {
newArr.push(arr2[j])
j++
} else {
if(arr1[i]) newArr.push(arr1[i]);
if(arr2[j]) newArr.push(arr2[j]);
i++;
j++
}
}
return newArr
}
mergeSort([2,4,6,7], [1,2,3,5,8,9,10,33,44,49]);
方法2
每次循环移除原数组中元素,对元素组产生影响
function _mergeSort(arr1, arr2) {
let newarr = [];
while (arr1.length && arr2.length) {
if (arr1[0] > arr2[0]) {
newarr.push(arr2.shift());
} else if (arr1[0] < arr2[0]) {
newarr.push(arr1.shift());
} else {
newarr.push(arr1.shift());
newarr.push(arr2.shift());
}
}
if (arr1.length) {
newarr.push(...arr1);
}
if (arr2.length) {
newarr.push(...arr2);
}
return newarr;
}
_mergeSort([2,4,6,7], [1,2,3,5,8,9,10,33,44,49]);