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

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

转载于:https://juejin.im/post/5c8baa405188257b050d7e45

两个有序数组如何合并成一个有序数组相关推荐

  1. 两个有序顺序表合并成一个有序顺序表

    一 概述 将两个有序顺序表合并为一个新的有序表,并由函数返回结果顺序表.实际过程中应该不断取下两个顺序表表头较小的结点存在新的顺序表中,然后,将其中某个表中的剩余数据直接加到新的顺序表后面. 二 代码 ...

  2. 两个无序单链表,排序后合并成一个有序链表

    两个无序单链表,排序后合并成一个有序链表 算法思想:用冒泡法,对链表1和2进行排序,对排序后的两个链表,从小到大进行循环,装入链表3中. #include<stdio.h> #includ ...

  3. 两个有序链表合并成一个有序的单链表

    将这两个有序链表合并成一个有序的单链表 要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间 表中允许有重复数据 算法描述 (1)定义一个合并后的指针pc指向La表的头结点.由于要求不占 ...

  4. 将两个整形数组排序后合并成一个数组

    将两个整形数组排序后合并成一个数组, 数组排序采用快速排序法,快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j) ...

  5. 将k个有序链表合并成一个有序链表

    将k个有序链表合并成一个有序链表 这里以从小到大排序为例, 时间复杂度为O(nlgk). 特点:利用最小堆来完成k路归并 思路:取每个列表中的第一个元素,并将其放在最小堆中.与每个元素一起,必须跟踪从 ...

  6. 将两个有序数组合并成一个有序数组

    将两个有序数组按从小到大顺序合并成一个数组. #include<iostream> using namespace std; int main() {int a[5]={1,5,6,8,9 ...

  7. 合并两个有序数组,合并之后保持有序

    /*** * @param a 有序数组a* @param b 有序数组b* @param c 合并之后的有序数组c*/public static void merge(int[] a,int[] b ...

  8. php 二维数组去重合并,PHP 二维数组去重合并

    以为其中一维数组相同字段合并,并且total字段相加 $arr=array(5) { [0]=> array(3) { ["id"]=> string(1) " ...

  9. 指针方法实现将两个有序的数组合并成一个有序数组

    /*int i,j;//非指针第一种,兼容性更大,如果输入非有序数字可自动排列     for(i=0;i<anum;i++)     {         c[i]=a[i];     }   ...

最新文章

  1. linux——虚拟机的图形安装、管理以及快照
  2. SQL基础【八、Insert】
  3. 模拟实现mapset
  4. c语言中把一个数缩小十倍_C语言实例第04期,在控制台打印出著名的杨辉三角...
  5. 【JavaScript】jsonp
  6. jbod ugood 磁盘驱动状态_LSI Storcli 工具使用
  7. 【Python】排序函数 sort、sorted 对复杂列表排序
  8. librdkafka安装步骤
  9. 计算机仿真系统模型有,计算机仿真在光伏发电系统模型中的应用研究原稿(最终定稿)...
  10. 南师大C:真分数分解为埃及分数
  11. LOJ#6198. 谢特(SAM+01Trie树合并)
  12. 5种类型的图像注释简介
  13. “HEAP:Invalid Address specified to RtlValidateHeap( 000D0000, 019FEF18 )错误
  14. 量子计算机亨通光电,在量子领域新成果:在半导体“自旋量子位元”(量子计算机的一种基本组件) 利用悉尼...
  15. 白蛋白纳米粒|莫西沙星小鼠血清白蛋白MSA纳米粒|利多卡因大鼠血清白蛋白RSA纳米粒
  16. ROS学习笔记之小乌龟跟随
  17. Python4:操作列表
  18. 再次遇到ORA-04030的错误
  19. php 缓冲区溢出漏洞,在Linux 容器中对php-fpm缓冲区溢出漏洞的复现分析 ( CVE-2019-11043 )...
  20. C#版二维坐标点按行排序

热门文章

  1. ImageButton的坑 ImageButton 有问题
  2. RxJava Rxandroid 结合 Retrofit 使用
  3. Android分享功能
  4. 第四周项目五-用递归方法求解(求n的阶乘)
  5. 第三周项目四-穷举法解决组合问题(1)
  6. Ninja提升编译速度的方法-Android10.0编译系统(十)
  7. Unable to merge dex
  8. RocketMQ NameServer启动要初始化哪些参数
  9. 从源码角度分析MapReduce的map-output流程
  10. 【转载】 C#使用Math.Abs返回数值的绝对值