每日一题--有序数组合并

题目

  • 原文:
    You are given two sorted arrays, A and B, and A has a large enough buffer at the end to hold B. Write a method to merge B into A in sorted order.
  • 译文:
    A和B是两个有序数组(假设为递增序列),而且A的长度足以放下A和B中所有的元素, 写一个函数将数组B融入数组A,并使其有序。

分析

  • 最简单的方法是新开一个数组C,将A(i++)和B(j++)从前往后依次比较较小的那个放入C(k++),但是这样的空间复杂度为O(m+n)。由于题目中明确指出A的大小已经足够容纳, 所以直接在A上直接操作即可。
  • 可是如果我们还是按照从前往后对比数组A和数组B,依次取较小的元素放入数组A, 这样就有要放入的位置上A本身元素的问题,处理起来就麻烦了。
  • 相反,如果我们从A和B的尾部元素开始对比,每次取大的元素放在融入B后数组A的尾部, 这样一来,要放入的位置就不会出现上面的冲突问题。当对比结束时, 即可得到一个排好序的数组A,代码如下。

代码

#include<iostream>
using namespace std;

void merge(int a[], int b[], int m, int n) {
	int k = m + n - 1;
	int i = m - 1;
	int j = n - 1;
	while(i >= 0 && j >= 0) {
		int n = k;
		a[k--] = (a[i] > b[j]) ? a[i--] : b[j--];
	}
	while(j >= 0) {
		a[k--] = b[j--];
	}
} 

void printarray(int a[], int m) {
	for(int i = 0; i < m; i++) {
		cout << a[i] << " ";
	} 
}

int main() {
	int a[] = {1, 3, 5, 7, 9};
	int b[] = {2, 4, 6, 8};
	int m = sizeof(a) / sizeof(int);
	int n = sizeof(b) / sizeof(int);
	merge(a, b, m, n);
	cout << "a merge b is:";
	printarray(a, m+1);
}

结果

这里是引用

猜你喜欢

转载自blog.csdn.net/weixin_39860046/article/details/88204108