实现2个排好序的子序列合并

数组a,b为已排序好的升序序列。

思路:1. 将a,b数组copy到一个新的数组c中(数组c的长度为a,b之和)

   2. 在c中以数组a为基准,当b中的数值小于a的时候,a中以后数值向后移1位,然后把当前b的值赋值过来。

具体实现:

public static int[] sort(int[] a, int[] b) {

        // 将a,b数组copy到数组c中
        int[] c = new int[a.length + b.length];
        System.arraycopy(a, 0, c, 0, a.length);
        System.arraycopy(b, 0, c, a.length, b.length);

        int i = 0, j = a.length, k;
        while (i < j) {
            if (j < c.length && c[i] > c[j]) {
                int tem = c[j];
                for (k = j; k > i; k--) {
                    c[k] = c[k - 1];
                }
                c[i] = tem;
                i++;
                j++;
            } else {
                i++;
            }
        }

        return c;
    }
时间: 2024-10-29 19:10:17

实现2个排好序的子序列合并的相关文章

将两个排好序的序列合并成一个(指针和数组分别实现)

1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { 12 List

[算法]在行列都排好序的矩阵中找数

题目: 给定一个有N*M的整型矩阵matrix和一个整数K,matrix的每一行和每一列都是排好序的.实现一个函数,判断K是否在matrix中. 例如: 0   1   2   5 2   3   4   7 4   4   4   8 5   7   7   9 如果K为7,返回true:如果K为6,返回false. 要求时间复杂度为O(N+M),额外空间复杂度为O(1). 思路: 1.从矩阵最右上角的数开始寻找(row=0,col=M-1). 2.比较当前数matrix[row][col]与

合并两个已经排好序的不等长的数组

给两个已经排好序的数组,这两个数组的长度可能不相等,如何将他们合并? package airth; public class TestMergeArray { /**  * 功能:  * 作者: jiangfuqiang  * 创建日期:2014-10-13  * 修改者: mender  * 修改日期: modifydate  * @param args  */ public static void main(String[] args) { // TODO Auto-generated me

[经典面试题]输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。

[题目] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1. [分析] 这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组的特性,我们应该能找到更好的解法. 我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面

58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中

#include<iostream> using namespace std; int main() { int n,k; int temp; int a[11]={1,4,6,9,11,13,35,44,46,50}; cout<<"原数组是:"<<endl; for(int p=0;p<10;p++) { cout<<a[p]<<" "; } cout<<endl; cout<&

将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。

int a[3] = {12, 15, 17}; int b[4] = { 2, 8, 16, 22}; int c[7] = {0}; int i = 0, j = 0, k = 0; while (i < 3 && j < 4 ) { if (a[i] > b[j]) { c[k++] = b[j++]; } else { c[k++] = a[i++]; } } while (i < 3) { c[k++] = a[i++]; } while (j <

【LeetCode-面试算法经典-Java实现】【021-Merge Two Sorted Lists(合并两个排好序的单链表)】

[021-Merge Two Sorted Lists(合并两个排好序的单链表)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 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. 题目大意 合并两个排序链表并返回一个新的列表.新的链表的

【算法导论学习-016】两个已排过序的等长数组的中位数(median of two sorted arrays)

问题来源 <算法导论>P223 9.3-8: Let X[1..n] and Y[1..n] be two arrays, each containing nnumbers already in sorted order. Give an O(lgn)-time algorithm to find themedian of all 2n elements in arrays X and Y. 翻译过来即:求两个等长(n个元素)的已排序数组A和B的中位数 方案1:对两个数组进行归并直到统计到第n

有一个从小到大排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //有一个从小到大排好序的数组.现输入一个数,要求按原来的规律将它插入数组中. var arr = [1, 2, 3, 4, 5, 7, 9]; function insertScot