Coding:就地合并两个排序数组

描述

给定两个大小分别为m和n的已排序的数组x和y,通过保持排序顺序将x的元素与y的元素合并。即用前m个最小元素填充x,其余元素填充y。

要求就地完成,不能创建其他数据结构。

如:
输入:

arrX = {2,5,8,10,15};
arrY = {1,6,9};   

输出:

arrX = {1,2,5,6,8};
arrY = {9,10,15};  

分析

这个问题的麻烦点在于不能创建新的数组,只能就地完成。
思路:由于数组本身已经是有序的,那么我们通过循环将x数组每个元素与y数组的第一个元素进行对比,如果小于,那么交换两个元素,然后将y[0]移动到y数组中正确的位置,以保证顺序不变。

代码:

#include <iostream>
#include <vector>

using namespace std;

void printArray(const vector<int> &arr)
{
    for(auto & iter : arr){
        cout << iter << " ";
    }
    cout << endl;
}

void mergeArray(vector<int> &arrX,vector<int> &arrY)
{
    for(int i = 0 ; i < arrX.size() ; ++i){

        if(arrX.at(i) > arrY.at(0)){
            std::swap(arrX[i],arrY[0]);
            auto first = arrY[0];

            auto j = 1;

            for(;j < arrY.size() && arrY[j] < first ; ++j){
                arrY[j-1] = arrY[j];
            }
            arrY[j-1] = first;

        }
    }
}

int main()
{
    vector<int> arrX = {2,5,8,10,15};
    vector<int> arrY = {1,6,9};

    mergeArray(arrX,arrY);

    printArray(arrX);
    printArray(arrY);
    
    return 0;
}

这个题中的关键点是两个数组本身是有序的,所以x数组元素和y数组第一个元素对比并交换后不用考虑x的顺序是否变化,只需要考虑在交换后将y第一个元素放到正确位置即可。

相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页