**最近看一本書上有一個面試題, ?原題目是 有兩個遞增數組 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;
~~~
結果

- 前言
- C++數據結構與算法------------二叉樹的2種創建
- 二叉樹的創建以及利用迭代實現中序、先序、后序遍歷、清空
- 數據結構-----哈夫曼樹的構造以及遍歷
- 二叉搜索樹的非遞歸創建和搜索
- 二叉搜索樹非遞歸方式刪除節點
- Lua中table內建排序與C/C++/Java/php/等內排序算法的排序效率比較
- 內嵌匯編與C/C++實現的冒泡排序,快速排序算法排序500W個數據對比
- 菜鳥學算法--簡單的交換和最大公約數算法入門篇
- 菜鳥學算法----改進后的歐幾里得算法
- C++實現一個線程安全的單例工廠
- 關于有序二維矩陣查找和字符串替換的兩道算法題
- 算法有序數組合并---在空間足夠的情況下,進行O(n)的合并 并且移動次數最小