
每日一算法-3-数组
Bi元素假如找到C中一个合适的位置想要插入,就需要此元素后的所有元素向后移动一个位置 即此时所有应该向后移动的元素可以看做一个后缀整体,只需保留C中待插入位置之前的元素顺序,然后将后缀重新再赋予即可 此时Bi向C插入元素有三种可能性
在C之前插入,之间插入,之后插入 "之间"插入的只需要比较两边的值,不小于前一个,小于后一个 "之前"插入的只小于第一个(因为事先已经排序,不会有再比AB最小值再小的元素) "之后"插入的必定大于当前C数组最后一个元素
发布日期:2021-05-06 20:02:24
浏览次数:19
分类:技术文章
本文共 3396 字,大约阅读时间需要 11 分钟。
文章目录
问题
合并两个已排序的数组
输入:arr1 [] = { 1,3,4,5},arr2 [] = { 2,4,6,8}输出:arr3 [] = { 1,2,3,4,4,5,6 8}
解决
思路
1.两个数组A,B,创建第三个数组C,C的长度为AB之和
先将A的值逐个赋给C两次遍历
遍历B取出B的元素 遍历C中的元素,遍历次数等于A.length+Bi,因为随着B元素的插入,C的元素在不断增长 可以设想:

优化:因为都是升序排序,B向A中插入元素后可以保留此元素坐标,下次B元素直接在上次B元素插入的坐标位置后比较即可,坐标之前的不用比较,因为坐标之前的元素没有比当前B元素再大的了
package array;import java.util.ArrayList;import java.util.Arrays;/** * @ClassName MegerArray * Description TODO **/public class MegerArray { public static void main(String[] args) { int[] arr1 = { 1, 3, 4, 5,6}, arr2 = { -1,0,0,1,2,3,7,8,9,10,10,10,90,98,98,98},arr3=new int[100]; MegerArray megerArray = new MegerArray(); megerArray.megerArray(arr1,arr2,arr3); } /*另外一种思路是使用一个数组吸收所有数据然后排序即可*/ /*此种算法也许最难*/ /*我希望这里A最长,则比较的次数相对较小*/ public void megerArray(int[] A,int[] B,int[] C) { for (int i = 0; i < A.length; i++) { C[i] = A[i]; } int allLong=A.length + B.length; int index = 0; int count=0; for (int i = 0; i < B.length; i++) { System.out.println("数据检测" + B[i]); for (int i1 = index; i1=C[A.length+i-1]) { C[A.length+i] = B[i]; System.out.println(Arrays.toString(C)); index=A.length+i-1; break; } /*中间插入*/ if (B[i] >= C[i1] && B[i] < C[i1+1]) { index=i1; System.out.println("条件符合"); int[] saveSuffix=new int[A.length+i-i1-1]; for (int i2 = i1+1,temp=0; i2
2.将两个数组的最小值比较,每次将最小的插入C中
然后将还有剩余的数组直接加在末尾即可此种方法简单
package array;import java.util.Arrays;/** * @ClassName MergeSimple * Description TODO **/public class MergeSimple { public static void main(String[] args) { int[] arr1 = { 1, 3, 4, 5, 6}, arr2 = { -1, 0, 0, 1, 2, 3, 7}, arr3 = new int[100]; int i = 0,j=0,k=0; while(i
可能会有疑问,假如1 3 5, 2 4 6,最后只比较最小值得到的不是1 2 3 4 5吗?
比较到5就会退出循环,因为此时i已经到3,等于了A的长度 所以才有后面的两个while,专门用于收集那些未比较的数据3.还有一种方法,使用hashmap
hashmap的特性package array;// Java program to merge two sorted arrays//using mapsimport java.io.*;import java.util.*;class TestHash { // Function to merge arrays static void mergeArrays(int a[], int b[], int n, int m) { // Declaring a map.// using map as a inbuilt tool// to store elements in sorted order. Mapmp = new HashMap ();// Inserting values to a map. for (int i = 0; i < n; i++) { mp.put(a[i], true); } for (int i = 0; i < m; i++) { mp.put(b[i], true); }// Printing keys of the map. for (Map.Entry me : mp.entrySet()) { System.out.print(me.getKey() + " "); } } // Driver Code public static void main(String[] args) { int a[] = { 1, 3, 5, 7}, b[] = { 2, 4,4, 6, 8}; int size = a.length; int size1 = b.length;// Function call mergeArrays(a, b, size, size1); }}// This code is contributed by rag2127
entryset比普通的key,然后value获取值更快,因为提前获得了key-value对象,后面只是从对象集合中查询
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年03月09日 13时35分13秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JavaScript 自学手册(文档教程)
2019-03-01
Java语言特点与学习
2019-03-01
夜光精讲 Opentcs 三大算法(十三)调度算法
2019-03-01
BCGControlBar教程:应用向导
2019-03-01
MyEclipse教程:Web开发——部署并测试项目
2019-03-01
【更新】CLion v2018.3发布(六):VCS和插件
2019-03-01
文件服务器——src文件夹
2019-03-01
从零构建通讯器--5.2三次握手,telnet,wireshark
2019-03-01
如何判断两个浮点数是否相等?
2019-03-01
2021牛客寒假算法基础集训营3
2019-03-01
苹果进军搜索,背后藏着什么“阳谋”?
2019-03-01
egg:如何在控制器中拿到前端传的参数
2019-03-01
MVC之修改
2019-03-01
struct 模块
2019-03-01
python之集合类型内置方法
2019-03-01
编程与编程语言分类
2019-03-01
【 UVA - 572 】 Oil Deposits (DFS水题)
2019-03-01
约瑟夫环问题
2019-03-01