**最近看一本书上有一个面试题, 原题目是 有两个递增数组 A1 A2, A1的内存空间足够长, 现在要求合并 A2到A1,并且要求移动次数最小 ,面试的时候 我们尽量要以 **
**最高效的方式完成 ,下面是此题 O(n)解法。**
~~~
///合并
void MergeArray(int *arrA1,int *arrA2,int nLenA1,int nLenA2)
{
if(!arrA1||!arrA2)
return ;
//合并后的尾部
int *pBehandA1=(arrA1+nLenA1-1+nLenA2);
int *pFrontA1=arrA1+nLenA1-1 ;
int *pEndA2= arrA2+nLenA2-1;
//循环次数 n 或者只剩下第二个数组
for(int i=nLenA1+nLenA2,j=nLenA2,k=nLenA1; i>0; i--)
{
if(j>0&&k>0)
{
//当A2 大于 A1
if(*pEndA2>=*pFrontA1)
{
*pBehandA1=*pEndA2 ;
pEndA2-- ;
j--;
}
//当A2小于 A1
else if(*pEndA2<*pFrontA1)
{
*pBehandA1=*pFrontA1 ;
pFrontA1-- ;
k--;
}
}
//结束
else if(j<=0)
{
break;
}
//当前面数组合并完毕
else if(k<=0&&j>0)
{
*pBehandA1=*pEndA2 ;
pEndA2-- ;
j--;
}
pBehandA1--;
}
}
~~~
测试代码
~~~
int *p1=new int[100] ;
p1[0]=10;
p1[1]=40;
p1[2]=60;
p1[3]=70;
p1[4]=80;
p1[5]=90;
p1[6]=99;
int *p2=new int[100] ;
p2[0]=3;
p2[1]=7;
p2[2]=9;
p2[3]=11;
p2[4]=21;
p2[5]=22;
p2[6]=33;
MergeArray(p2,p1,7,7);
for(int i=0;i<14;i++){
cout<<p2[i]<<" " ;
}
cout<<endl;
~~~
结果
![](https://box.kancloud.cn/2016-03-03_56d79b79d616f.jpg)
- 前言
- C++数据结构与算法------------二叉树的2种创建
- 二叉树的创建以及利用迭代实现中序、先序、后序遍历、清空
- 数据结构-----哈夫曼树的构造以及遍历
- 二叉搜索树的非递归创建和搜索
- 二叉搜索树非递归方式删除节点
- Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较
- 内嵌汇编与C/C++实现的冒泡排序,快速排序算法排序500W个数据对比
- 菜鸟学算法--简单的交换和最大公约数算法入门篇
- 菜鸟学算法----改进后的欧几里得算法
- C++实现一个线程安全的单例工厂
- 关于有序二维矩阵查找和字符串替换的两道算法题
- 算法有序数组合并---在空间足够的情况下,进行O(n)的合并 并且移动次数最小