【两个有序数组合并】

问题描述:
给定两个有序整数数组 A 和 B,将B合并到A中,使得 A 成为一个有序数组。
说明:

  1. 初始化 A 和 B 的元素数量分别为 m 和 n。
  2. A有足够的空间(空间大小大于或等于 m + n)来保存 B 中的元素。
  3. 默认升序。

输入输出描述:

在这里插入图片描述
步骤:1、创建两个数组A、B分别读取输入流数据,其中A数组的大小应该设置为A、B两数组长度之和,因为A数组最后存放的是合并后的数据。
2、设置三个变量i,j,k分别指向A、B数组,以及合并后的数组的末尾,从末尾开始一个个遍历A、B数组中的元素,若A大于B,则把A数组中的元素放到A的最后位置,反之则把B数组位置放到A数组最后位置,最后遍历完之后,若B数组还剩余元素,则把数组再添加到A数组中。

代码:

import java.util.*;
public class MergeTwoLists {
    
    
    public static void main(String[] args) {
    
    
        Scanner scanner = new Scanner(System.in);

        // 从标准输入读取数组A的元素数量和数组A的元素

        int m = scanner.nextInt();
        int n = scanner.nextInt();
        int[] A = new int[m+n];
        int[] B = new int[n];
        for (int i = 0; i < m; i++) {
    
    
            A[i] = scanner.nextInt();
        }

        // 从标准输入读取数组B的元素数量和数组B的元素

        for (int i = 0; i < n; i++) {
    
    
            B[i] = scanner.nextInt();
        }
        merge(A, m, B, n);

        // 输出合并后的数组A到标准输出
        for (int num : A) {
    
    
            System.out.print(num + " ");
        }
    }
    public static void merge(int[] A, int m, int[] B, int n) {
    
    
        int i = m - 1; // 指向数组A的末尾
        int j = n - 1; // 指向数组B的末尾
        int k = m + n - 1; // 指向合并后的数组A的末尾

        while (i >= 0 && j >= 0) {
    
    
            if (A[i] > B[j]) {
    
    
                A[k] = A[i];
                i--;
            } else {
    
    
                A[k] = B[j];
                j--;
            }
            k--;
        }

        // 如果数组B中还有剩余元素,将其复制到数组A中
        while (j >= 0) {
    
    
            A[k] = B[j];
            j--;
            k--;
        }
    }

}

猜你喜欢

转载自blog.csdn.net/qq_45257495/article/details/132635161