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

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

下面有两段相似的代码,第一段除了返回合并后的有序数组还将这两个有序数组清空了,该算法的思路是始终比较两个数组的首元素大小,然后将小者 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 到结果数组中去,因为之前的循环终止条件就是至少有一个数组已经遍历结束。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,977评论 0 13
  • 数组是值的有序集合。每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引。 JavaScript...
    劼哥stone阅读 1,148评论 6 20
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,006评论 0 13
  • 数组的概述 PHP 中的数组实际上是一个有序图。图是一种把 values 映射到 keys 的类型。此类型在很多方...
    dptms阅读 1,638评论 0 4