描述
给定两个大小分别为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第一个元素放到正确位置即可。