美文网首页数据结构与算法
两个有序数组如何合并成一个有序数组

两个有序数组如何合并成一个有序数组

作者: 奕玄 | 来源:发表于2019-03-15 21:45 被阅读2次

我这里考虑的两个数组均是升序排序,当然降序的两个数组进行合并算法是类似的。

下面有两段相似的代码,第一段除了返回合并后的有序数组还将这两个有序数组清空了,该算法的思路是始终比较两个数组的首元素大小,然后将小者 shift 出来 push 到结果数组中去,因为总是会将数组首元素较小的那个移出,故不用改变比较数组的索引值,一直固定为 0 就行了。最后不要忘记将长度值大于 0 的数组中的元素移出放置到结果数组中。

/* 清空了原来的两个有序数组 */
function mergeTwoSortedArr (arr1, arr2) {
  var retArr = [];
  /* 遍历比较两个数组的首元素大小,小者 shift 出来 push 到结果数组中去 */
  while (arr1.length > 0 && arr2.length > 0) {
    if (arr1[0] < arr2[0]) {
      retArr.push(arr1.shift());
    } else if (arr1[0] > arr2[0]) {
      retArr.push(arr2.shift());
    } else {
      retArr.push(arr1.shift());
      retArr.push(arr2.shift());
    }
  }
  /* 将数组(最多有一个)剩余元素移出放置到结果数组中 */
  while (arr1.length > 0) {
    retArr.push(arr1.shift());
  }
  while (arr2.length > 0) {
    retArr.push(arr2.shift());
  }
  return retArr;
}

// 示例
var arr1 = [2, 3, 5];
var arr2 = [3, 4, 7, 9];
console.log(mergeTwoSortedArr(arr1, arr2));   // [2, 3, 3, 4, 5, 7, 9]

第二段代码则没有影响原来的两个有序数组,通过遍历比较两个数组当前元素的大小,小者 push 到结果数组中去,相应数组索引加一,然后再进行循环比较。同样,最后不要忘记将未遍历过的数组元素复制到结果数组中。

/* 未对原来的两个有序数组做改动 */
function mergeTwoSortedArr (arr1, arr2) {
  var retArr = [];
  var len1 = arr1.length;
  var len2 = arr2.length;
  var i = 0, j = 0;
  /* 遍历比较两个数组当前元素的大小,小者 push 到结果数组中去,相应数组索引加一 */
  while (i < len1 && j < len2) {
    if (arr1[i] < arr2[j]) {
      retArr.push(arr1[i]);
      i++;
    } else if(arr1[i] > arr2[j]) {
      retArr.push(arr2[j]);
      j++;
    } else {
      retArr.push(arr1[i], arr1[i]);
      i++;
      j++;
    }
  }
  /* 将数组(最多有一个)剩余元素 push 到结果数组中 */
  for (; i < len1; i++) {
    retArr.push(arr1[i]);
  }
  for (; j < len2; j++) {
    retArr.push(arr2[j]);
  }
  return retArr;
}

// 示例
var arr1 = [2, 3, 5];
var arr2 = [3, 4, 7, 9];
console.log(mergeTwoSortedArr(arr1, arr2));   // [2, 3, 3, 4, 5, 7, 9]

注:上面两段代码算法的最后一步最多还要对一个数组进行操作——将其中的元素 push 到结果数组中去,因为之前的循环终止条件就是至少有一个数组已经遍历结束。

相关文章

  • LeetCode--两个有序数组合并

    题目: 如何将两个有序数组合并成一个有序数组 思路: 1:首先初始化 辅助数组,该数组存储的是两个有序数组的所有数...

  • js 合并两个有序数组 成一个有序数组

    将两个有序数组合并成一个有序数组,假设两个数组,a和b合并成c. 我的想法是,以b数组作为参照,从下标0 开始 逐...

  • 作业帮

    1、写输出,关于提升 分别输出 相当于 拓展: 2、两个有序数组,合并成一个有序数组。 思路,A,B两个数组从头比...

  • Swift 归并排序

    Swift 归并排序 基本原理: 对于两个有序子数组,合并成一个有序数组,是一个较为简单的事情。可以对两个子数组,...

  • java合并两个有序的数组

    需求:有序数组arr1和arr2,将它们合并成有序数组newArr(递增数组)。 思路:新建一个以两个集合长度之和...

  • 算法 -- 归并排序 - 草稿

    merge 归并排序原理 归并排序 == 递归 + 合并 合并 将两个有序的数组合并成一个有序的大数组;(从两个小...

  • java算法_有序数组合并

    无序数组合并: 有两个有序数组,合并成一个有序数组,例如:arr1={1,3,4,7} arr2={2,5,8} ...

  • 排序 二 归并排序

    归并操作指将两个有序的数组归并成一个更大的有序数组。要将一个数组排序,可以先(递归的)将它分成两半分别排序,然后将...

  • 数据并集,交集,差集运算

    两个有序整型数组交集 两个有序数组并集 两个有序数组的差集

  • 数据结构-Java 02.习题汇总1

    1. 合并两个有序的数组 给出两个有序的整数数组A和B,请将数组B合并到数组A中,变成一个有序的数组。注意:可以假...

网友评论

    本文标题:两个有序数组如何合并成一个有序数组

    本文链接:https://www.haomeiwen.com/subject/ssrdmqtx.html