阅读 168

两个有序数组合并为一个有序数组

经典面试题,将两个有序数组合并为一个有序数组。

1、实现方式:

(1)while循环遍历两个数组(不破坏原数组,生成新数组)。 直到两个数组的计算的索引(i与j),其中任何一个大于自身数组的长度,终止循环 。

(2)正对比,错位对比。

因为两个数据都是有序的。故,只需按照元素值对比大小,然后取最大的值即可;

如果其中一个数组索引的元素值,小于另外一个数组索引的元素值,将最小的值放到newArr中;

并叠加最小值的索引值(列i++);

(3)元素值有3个对比(小于、大于、等于)。

小于,取小于的元素值,叠加小于的索引;

大于,取小于的元素值,叠加小于的索引;

等于,两个元素值都取,同时叠加两个索引;

2、代码

方法1
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
}

const arr1 = mergeSort([2,4,6,7], [1,2,3,5,8,9,10,33,44,49]);
console.log('arr1', arr1)

复制代码
方法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;
}
const arr2 = _mergeSort([2,4,6,7], [1,2,3,5,8,9,10,33,44,49]);
console.log('arr2', arr2)
复制代码
文章分类
前端
文章标签