题目:
数组A空间大小为m+n,数组A中保存着n个以升序的整数元素。数组B中保存着m个升序的整数元素。
请将数组B插入数组A中且使A仍有序,且时间复杂度最小。
分析:
因为数组已经有序,且数组A的空间刚好够存储插入的数组B,因此我们的思路是利用两个数组已经有序的特性,从大到小依次取出并比较和插入。
下标变量 index_a 初始值为n-1,代表数组A的最后一个位置。
下标变量 index_b 初始化为m-1,代表数组B的最后一个位置。
下标变量 index 初始化为 n+m-1,代表即将插入的位置。
比较和插入规则:
1.
若B[index_b ] > A[index_a] ,则B[index_b ] 存入A[index], 同时更新下标 index= index-1,index_b= index_b-1。
2.
若B[index_b ] < A[index_a] ,则A[ index_a ] 存入A[index], 同时更新下标 index= index-1, index_a = index_a -1。
3.
若B[index_b ] == A[index_a] ,则 A[ index_a ] 存入A[index],index = index -1 ,B[index_b ] 存入A[index] , 更新下标index= index-1, index_a = index_a -1,index_b= index_b-1。
代码:
#include <iostream>
using namespace std;
void MergeSortedArray(int a[], int b[], int n, int m)
{
int indexA = n-1;
int indexB = m-1;
int index = n+m-1;
while(indexB >= 0)
{
if(b[indexB] > a[indexA])
{
a[index] = b[indexB];
indexB--;
index--;
}
else if(b[indexB] < a[indexA])
{
a[index] = a[indexA];
indexA--;
index--;
}
else
{
a[index] = b[indexB];
index--;
a[index] = a[indexA];
index--;
indexA--;
indexB--;
}
}
}
int main()
{
int arrayA[14] = {1,3, 4,5,7,9,10,12};
int arrayB[6] = {2,3,6,8,9,11};
//int arrayA[14] = {1,2,3,4,5,6,7,8};
//int arrayB[6] = {9,10,11,12,13,14};
//int arrayA[14] = {21,22,23,24,25,26,27,28};
//int arrayB[6] = {9,10,11,12,13,14};
int n = 8; //numbers in array A
int m = 6; //numbers in array B
MergeSortedArray(arrayA, arrayB, n, m);
for(int i =0; i<n+m; i++)
{
cout<<arrayA[i]<<endl;
}
getchar();
}
注:除非特殊说明,编译环境均为Visual Studio 2008。后续考虑采用支持C++11标准的
Visual Studio 2012。
原创文章:
欢迎转载,请注明出处。如果用于商业用途,请联系本人和注明出处。多谢!