码迷,mamicode.com
首页 > 编程语言 > 详细

有两个升序的的数组A1和A2,内存在A1末尾有足够的多余空间容纳A2,设计一个函数,把A2中的所有数字插入到A1中并且所有的数字都是升序的。

时间:2016-04-15 18:24:30      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

  此问题和替换空格问题几乎都可以用一个模式高效求解,即都采用从后往前的方法比较A1和A2的数字,然后把较大的数复制到A1合适的位置。防止采用从前往后的方法导致大量的重复移动。

具体思路:类似于merge_sort中的merge过程,首先可以得到合并后A1数组的实际长度(A1.length+A2.length)

     依次比较两个数组中的最后一个元素,把较大的数依次放入A数组的末尾,直到A1中元素比较完成或者A2中的数组比较完成。

     然后只需要把多出的元素直接插入A1前段即可。

具体的代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 const int MaxArray = 100;
 4 /*
 5     alen:数组A的实际元素长度
 6     blen:数组B的实际元素长度
 7     假设A末尾有充分的空间容纳B
 8 */
 9 void Combine_Array(int A[MaxArray+1],int B[],int alen,int blen)
10 {
11     int i = alen - 1;//j指向A的最后一个元素
12     int j = blen - 1;//i指向B的最后一个元素
13     for (int k = alen + blen - 1; k >= 0; k--)//从后往前插入
14     {
15         if (A[i] > B[j]){//选择较大的依次放在尾部
16             A[k] = A[i];
17             --i;
18         }
19         else{
20             A[k] = B[j];
21             j--;
22         }
23         while (i < 0&&j>=0){//如果B剩余,则把B中的剩余元素依次移动到A的前端;若A剩余则证明已经排好
24             A[k] = B[j];
25             --j;
26         } 
27     }
28     for (int i = 0; i < alen+blen; i++)//打印出合并后的数组
29     {
30         cout << A[i] << "    ";
31     }
32     cout << endl;
33 }
34 int main5()
35 {
36     int A[MaxArray+1] = { 1, 3, 5, 7, 8, 12 };
37     int B[] = { 13, 15, 16, 20 };
38     Combine_Array(A, B, 6, 4);
39     system("pause");
40     return 0;
41 }

得到输出为:

技术分享

 

有两个升序的的数组A1和A2,内存在A1末尾有足够的多余空间容纳A2,设计一个函数,把A2中的所有数字插入到A1中并且所有的数字都是升序的。

标签:

原文地址:http://www.cnblogs.com/General-up/p/5396193.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!