基本思路

  1.如果其中一个数组的元素均大于另一个数组的元素,则可以直接组合,不用拆分。

   即:其中一个数组的第一个元素大于或者小于另一个数组的最后一个元素

  2.若不满足1中的情况,则表明数组需要拆分,拆分的方法如下:

   (1)拆分前,默认两个数组以及最终输出数组的索引均为0;

   (2)将 两个数组 对应索引下的元素进行比较,小的一方 放入最终数组中的当前索引下的位置,并使小的一方数组的索引+1;

   (3)检查是否有数组已经遍历完毕,若有(即该数组的元素已经完全分配到结果数组中),则将另一个数组的剩余元素依次放入最终数组中,直接输出即可。

      (4)最终数组的索引+1,并重复(2),直到两个数组均完成索引任务。

  

      上图为假定的2-3步操作,A,B为要合并的数组,C为最终 输出数组,Index为该次填充后的下次索引变换情况。


源代码

public  int[] sortAndconnectArr(int FirstArr[], int SecondArr[]){
int[] ResultArr=new int[FirstArr.length+SecondArr.length];
//若两个Arr中其中一个Arr的都比另一个大,则能直接合成
if(FirstArr[FirstArr.length-1]<SecondArr[0]){
ResultArr=connectArr(FirstArr,SecondArr);
return ResultArr;
}
if(SecondArr[SecondArr.length-1]<FirstArr[0]){
ResultArr=connectArr(SecondArr,FirstArr);
return ResultArr;
}
//取FirstArr的第一个元素与SecondArr的第一个元素比较
//小的一方,放入ResultArr,并使其索引+1,继续比较,直到最后
int IndexOfFArr=0;
int IndexOfSArr=0;
int IndexOfRArr=0;
while (IndexOfFArr<=FirstArr.length-1||IndexOfSArr<=SecondArr.length-1){
if(FirstArr[IndexOfFArr]<SecondArr[IndexOfSArr]){
ResultArr[IndexOfRArr]=FirstArr[IndexOfFArr];
IndexOfFArr++;
}else {
ResultArr[IndexOfRArr]=SecondArr[IndexOfSArr];
IndexOfSArr++;
} //其中一方的数组已经全部遍历,将余下的数组部分写入ResultArr
//全部遍历完毕则因为IndexOfXX++的原因应该是正好等于Arr.Length
if(IndexOfFArr>FirstArr.length-1){
ResultArr=addArr(ResultArr,IndexOfRArr+1,SecondArr,IndexOfSArr);
return ResultArr;
}
if(IndexOfSArr>SecondArr.length-1){
ResultArr=addArr(ResultArr,IndexOfRArr+1,FirstArr,IndexOfFArr);
return ResultArr;
}
IndexOfRArr++;
}
return ResultArr;
}
public int[] connectArr(int FirstArr[], int SecondArr[]){
int[] ResultArr=new int[FirstArr.length+SecondArr.length];
System.arraycopy(FirstArr, 0, ResultArr, 0, FirstArr.length);
System.arraycopy(SecondArr, 0, ResultArr, FirstArr.length, SecondArr.length);
return ResultArr;
} public int[] addArr(int ResultArr[],int RArrIndex,int AddArr[],int AArrIndex){
while(AArrIndex<=AddArr.length-1){
ResultArr[RArrIndex]=AddArr[AArrIndex];
AArrIndex++;
RArrIndex++;
}
return ResultArr;
}

验证函数

public static void main(String[] args) {
int a[]={1,2,4,55,66,113,157,182,192,201};
int b[]={40,45,66,70,120,140,160,200,1655,1732};
int c[]=sortAndconnectArr(a,b);
for(int i=0;i<c.length-1;i++){
System.out.print(c[i]+" ");
}
}

结果预览

1  2  4  40  45  55  66  66  70  113  120  140  157  160  182  192  200  1655  1732
Process finished with exit code 0

Java 将两个有序数组合成为一个有序数组的更多相关文章

  1. Python3将两个有序数组合并为一个有序数组

    [本文出自天外归云的博客园] 第一种思路,把两个数组合为一个数组然后再排序,问题又回归到冒泡和快排了,没有用到两个数组的有序性.(不好) 第二种思路,循环比较两个有序数组头位元素的大小,并把头元素放到 ...

  2. 两个有序数组合并为一个有序数组---python

    def merge(a, b): """ 合并2个有序数组,默认a,b都是从小到大的有序数组 """ # 1.临时变量 i, j = 0, ...

  3. Java 将两个Map对象合并为一个Map对象

    实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中,代码如下所示,展示了两个 map 对象的合并,如果是多个 map 合并也是用这种方式. publi ...

  4. [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现

    合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一 ...

  5. Java基础知识强化之IO流笔记27:FileInputStream读取数据一次一个字节数组byte[ ]

    1. FileInputStream读取数据一次一个字节数组byte[ ]  使用FileInputStream一次读取一个字节数组: int read(byte[]  b) 返回值:返回值其实是实际 ...

  6. concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

    var arr1 = ['a', 'b', 'c']; var arr2 = ['d', 'e', 'f']; var arr3 = arr1.concat(arr2); // arr3 is a n ...

  7. PHP中的数组(二)常用数组处理函数

    数组的相关处理函数    一.数组键/值操作有关的函数        1.array_values()   无论是关联的还是索引的返回的都是索引数组 <?php $lamp=array(&quo ...

  8. php数组函数(分类基本数组函数,栈函数,队列)

    php数组函数(分类基本数组函数,栈函数,队列函数) 一.总结 1.常用数组函数 函数 描述 array() 创建数组. array_combine() 通过合并两个数组来创建一个新数组. array ...

  9. JS 数组常见操作汇总,数组去重、降维、排序、多数组合并实现思路整理

    壹 ❀ 引 JavaScript开发中数组加工极为常见,其次在面试中被问及的概率也特别高,一直想整理一篇关于数组常见操作的文章,本文也算了却心愿了. 说在前面,文中的实现并非最佳,实现虽然有很多种,但 ...

随机推荐

  1. PHP 页面静态化/纯静态化/伪静态化

    个人博客迁移至独立博客:https://blog.plcent.com/,欢迎大家访问 概念 PHP静态化分为:纯静态化 和 伪静态化:纯静态化又分为:局部静态化 和 完全静态化 纯静态化:是把PHP ...

  2. redis3.2新功能--GEO地理位置命令介绍

    概述 redis3.2发布rc版本已经有一段时间了,估计RedisConf 2016左右,3.2版本就能release了.3.2版本中增加的最大功能就是对GEO(地理位置)的支持.说起redis的GE ...

  3. 在CUDA8.0下编译安装OpenCV3.1.0来实现GPU加速(Compiling OpenCV3.1.0 with CUDA8.0 support)

    在CUDA8.0下编译安装OpenCV3.1.0 一.本人电脑配置:ubuntu 14.04, NVIDIA GTX1060. 二.编译OpenCV3.1.0前,读者需要成功安装CUDA8.0(网上有 ...

  4. Java基础总结--IO总结2

    1.键盘录入--Java具有特定的对象封装这些输入输出设备在System类定义 in-InputStream类型和out-PrintStream类型成员变量阻塞是方法:read()无数据就阻塞wind ...

  5. angularJs 个人初探笔记

    1.环境搭建与angular - phoneCat 安装可以通过git clone来下载源代码: git clone --depth=14 https://github.com/angular/ang ...

  6. java时间格式

    Calendar startdate = Calendar.getInstance(); startdate.setTime(new Date()); //当前时间 startdate.add(Cal ...

  7. 愚蠢的遗留BUG

    二次开发本来就是很恶心的事,我竟然是三次开发. 今天遇到一个BUG,上传图片的时候报错了,操作过程很简答,点击上传按钮,选择图片,确定上传,如图: 报错信息很直白,也很奇怪: (为了写博客,把代码回滚 ...

  8. Angular服务的5种创建方式

    config配置块 Angular应用的运行主要分为两部分:app.config()和app.run(),config是你设置任何的provider的阶段,从而使应用可以使用正确的服务,需要注意的是在 ...

  9. ES6新特新之箭头函数使用细节

    <=这个大家都知道是小于等于,那么=>是什么呢?今天我们就来探究一下ES6的新特新-----胖箭头函数. 其他语言的函数定义都是很简洁的,但是为什么javaScript的就那么复杂呢?还必 ...

  10. 操作系统--进程管理1--单个CPU情况

    1.进程概念 进程:一个正在执行的程序:操作系统提出进程概念目的:是为了跟踪程序在执行期间的状态.而程序只是一段代码,是一个静态的概念 无法准确描述程序执行时候发生的一切.程序代码被加载进内存后就以进 ...