首页 > 试题广场 >

实现一个 mergeArray 函数,对两个已经排好序(从小

[问答题]

实现一个 mergeArray 函数,对两个已经排好序(从小到大)的数组进行排序(从小到大),数组里面是数字均为整数,在 [0,100000) 之间,数组长度不超过 10000

输入数据有三行,第一行两个数字表示每个数组数字个数,后面两行分别表示两个数组

5,3

9,6,5,3,1

7,4,2

输出

1,2,3,4,5,6,7,9

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

/**
 * @author: sanjin
 * @date: 2019/9/29 15:34
 */
public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String s1 = s.nextLine();
        int n1 = Integer.parseInt(s1.split(",")[0]);
        int n2 = Integer.parseInt(s1.split(",")[1]);
        String s2 = s.nextLine();
        int[] nums1 = new int[n1];
        int[] nums2 = new int[n2];
        for (int i = 0; i < nums1.length; i++) {
            nums1[i] = Integer.parseInt(s2.split(",")[i]);
        }
        String s3 = s.nextLine();

        for (int i = 0; i < nums2.length; i++) {
            nums2[i] = Integer.parseInt(s3.split(",")[i]);
        }

        if (nums1.length > 1 && nums1[0] > nums1[1]) {
            reverse(nums1);
        }

        if (nums2.length > 1 && nums2[0] > nums2[1]) {
            reverse(nums2);
        }

        int[] ints = mergeArray(nums1, nums2);
        System.out.println(Arrays.toString(ints));

    }

    static void reverse(int[] nums) {
        int l = 0, r = nums.length - 1;
        while (l < r) {
            int t = nums[r];
            nums[r] = nums[l];
            nums[l] = t;
            l++;
            r--;
        }
    }

    static int[] mergeArray(int[] n1, int[] n2) {
        int p1 = 0, p2 = 0;
        if (n1.length == 0) return n2;
        if (n2.length == 0) return n1;
        int[] res = new int[n1.length + n2.length];
        int cur = 0;
        while (p1 < n1.length && p2 < n2.length) {
            if (n1[p1] < n2[p2]) {
                res[cur] = n1[p1];
                p1++;
            } else {
                res[cur] = n2[p2];
                p2++;
            }
            cur++;
        }

        while (p1 < n1.length) {
            res[cur] = n1[p1];
            p1++;
            cur++;
        }
        while (p2 < n2.length) {
            res[cur] = n2[p2];
            p2++;
            cur++;
        }
        return res;
    }
}

发表于 2019-09-29 16:29:42 回复(0)
应该是归并排序
发表于 2018-04-14 17:58:16 回复(0)
#include <stdio.h>
int main(int argc, char *argv[])
{
    int a[10000],b[10000], r[20000], i,j,k,n,m;
    scanf("%d%d", &n, &m);
    for (i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }
    for (i = 0; i < m; i++){
        scanf("%d", &b[i]);
    }
    i = j = k = 0;
    
    while(1) {
        if (j >= m){
            while(i < n){
                r[k++] = a[i++];
            }
            break;
        }
        if (i >= n){
            while(j < m){
                r[k++] = b[j++];
            }
            break;
        }
        
        if (a[i] > b[j]){
            r[k++] = a[i++];
        } else {
            r[k++] = b[j++];
        }
        
    }
    while(k--){
        printf("%d", r[k]);
        if (k > 0) {
            printf(",");
        }
    }
    return 0;
}

按测试用例写的,空间换时间
发表于 2018-03-12 16:56:16 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;


int main()
{
	int M,N,i=0,j=0,k=0;
	cin>>M>>N;
	int a1[M];
	int a2[N];
	int a3[M+N];
    
	//输入数据 
	for(i=0;i<M;i++)
	   cin>>a1[i];	
	for(i=0;i<N;i++)
	   cin>>a2[i];

	for(j=0,i=0,k=0;i<M||k<N;i++,j++)
	{
		if(i<M)
		{
			a3[j]=a1[i];
		}
		else
		{
			a3[j]=a2[k++];
		}
	}	
	
	sort(a3,a3+M+N);
	for(i=0;i<(M+N);i++)
	    cout<<a3[i]<<" ";
	return 0;
}

发表于 2017-08-14 17:10:27 回复(0)
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int l1=s.nextInt();
		int l2=s.nextInt();
		int[] arr1=new int[l1];
		int[] arr2=new int[l2];
		for (int i=0;i<l1;i++){
			arr1[i]=s.nextInt();
		}
		for (int i=0;i<l2;i++){
			arr2[i]=s.nextInt();
		}
		int[] arr3=mergeArray(arr1, arr2);
		System.out.print(arr3[0]);
		for (int i=1;i<arr3.length;i++){
			System.out.print(","+arr3[i]);
		}
	}
	public static int[] mergeArray(int[] arr1,int[] arr2){
		int len1=arr1.length;//数组1的长度
		int len2=arr2.length;//数组2的长度
		int[] arr3=new int[len1+len2];//组合的数组
		int i1=0,i2=0,i3=0;//数组123的起始标记
		while(i1<len1||i2<len2){
			int x=0,y=0;
			if(i1==len1){
				x=Integer.MAX_VALUE;
			}else{
				x=arr1[i1];
			}
			if (i2==len2){
				y=Integer.MAX_VALUE;
			}else{
				y=arr2[i2];
			}
			if (x>y){
				arr3[i3]=y;
				i2++;
				i3++;
			}else{
				arr3[i3]=x;
				i1++;
				i3++;
			}
		}
		return arr3;
	}
}
//说好的两个数组是从小到大排列的为什么测试案例是从大到小排列= =我是按照从小到大的排列来写的
发表于 2017-03-15 15:51:55 回复(2)