算法 - 合并两个有序数组成一个有序数组

最近看到一个算法题目,觉得很有意义,就自己查资料,摸索着自己实现了代码,特记录一下。

题目:有两个数组a[]和b[],将它们合并成数组c[],需要c[]也是有序数组。

有两种实现思路:

1. 定义一个新数组,长度为两个数组长度之和,将两个数组都copy到新数组,然后排序。

2. 给两个数组分别定义一个下标,最大长度是数组长度减一,按位循环比较两个数组,较小元素的放入新数组,下标加一(注意,较大元素对应的下标不加一),直到某一个下标超过数组长度时退出循环,此时较短数组已经全部放入新数组,较长数组还有部分剩余,最后将剩下的部分元素放入新数组,大功告成。

第一种方式应该是大多数人想到的,也比较容易实现,下面主要来实现第二种方式。

代码如下:

        public static int[] MergeList(int a[],int b[])
        {
            int result[];
//                定义一个新数组,长度为两个数组长度之和
                result = new int[a.length+b.length];
              //i:a数组下标    j:b数组下标  k:新数组下标
                int i=0,j=0,k=0;
//                按位循环比较两个数组,较小元素的放入新数组,下标加一(注意,较大元素对应的下标不加一),直到某一个下标等于数组长度时退出循环
                while(i<a.length && j<b.length)
                    if(a[i] <= b[j]) {
                        result[k++] = a[i++];
                        print(result);
                        System.out.println();
                    }else{
                        result[k++] = b[j++];
                    }
                /* 后面连个while循环是用来保证两个数组比较完之后剩下的一个数组里的元素能顺利传入 *
                 * 此时较短数组已经全部放入新数组,较长数组还有部分剩余,最后将剩下的部分元素放入新数组,大功告成*/
                while(i < a.length)
                    result[k++] = a[i++];
                while(j < b.length)
                    result[k++] = b[j++];
                return result;
           }
时间: 2024-08-04 18:21:06

算法 - 合并两个有序数组成一个有序数组的相关文章

经典算法——合并两个有序链表

题目描述 Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 完整测试程序: #include <iostream> using namespace std; struct ListNode { int val; ListNode* next; }; ListNod

合并两个有序数组到其中一个数组中

题目描述 Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume that A has enough space to hold additional elements from B. The number of elements initialized in A and B are m and n respectively. 解法一: 从结尾开始归并,不会覆

合并两个己排好序的链表及数组

唉,这么简单的东西,说简单是简单,关键是要把这东西写得好,老少兼知.应对所有测试用例,那就有点难了吧. 话说天下之事,作于细. 我们用图来说说吧: 看合并的步骤: (1) (2) (3) (4) 源代码: #ifndef COMBINE_TWO_LIST_H #define COMBINE_TWO_LIST_H #include"reverseList.h" ListNode *combineTwoList(ListNode *alist,ListNode *blist){ if(al

笔试算法题(22):二分法求旋转数组最小值 &amp; 骰子值概率

出题:将一个数组最开始的k个(K小于数组大小N)元素照搬到数组末尾,我们称之为数组的旋转:现在有一个已经排序的数组的一个旋转,要求输出旋转数组中的最小元素,且时间复杂度小于O(N): 分析: 时间复杂度小于O(N)也就是不能用常规的遍历思路:可以将数组看成两个都是递增序列(假设为升序)的子数组,并且前半段的元素均大于等于后半段的元素,分界点的位于后半段数组的第一个元素就是最小元素: 具体算法:两个指针left和right指向数组第一个和最后一个元素,使用Binary Search确定中间元素mi

算法 - 两个有序数组合并成一个有序数组

//两个有序数组的合并函数 public static int[] MergeList(int a[],int b[]) { int result[]; if(checkSort(a) && checkSort(b)) //检查传入的数组是否是有序的 { result = new int[a.length+b.length]; int i=0,j=0,k=0; //i:用于标示a数组 j:用来标示b数组 k:用来标示传入的数组 while(i<a.length &&

小算法:合并两个有序数组,合并之后仍然有序

1 /** 2 * 合并两个有序数组,合并后仍然有序 3 * @param a 要合并的数组A 4 * @param b 要合并的数组B 5 * @param c 合并后的数组C 6 */ 7 public static void merge(int a[] ,int b[],int c[]){ 8 int lengthA = a.length; 9 int lengthB = b.length; 10 11 int indexA = 0; 12 int indexB = 0; 13 int i

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

两个有序数组合并成一个有序数组 1. 题目描述 数组a是有序的,数组b也是有序的,如何高效地合并它们成一个数组,并且新数组也是有序的? 2. 从后往前合并 这道题目是师兄电面阿里的时候,问到的一道题目.现在我们来说一下解法~ 假设数组a足够长,可以在数组a上合并二者.我们的解法基本思想就是从后往前合并数组. 每次合并的时候,都要比较a和b当前数组的大小,取较大的值后移,注意一定要是后移! 为什么从后往前呢?其实就是为了方便后移,因为较大的一定是在后面的. 程序如下: #include<iostr

高效合并两个有序数组(Merge Sorted Array)

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.The number of elements initi

每天一个小算法(2)----合并两个有序链表

每天一个小算法还是有点没时间,尽量抽出时间写一写. 今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来. 代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^. 在Linux/g++下编译运行成功. 合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾. 1 #include