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


      此问题和替换空格问题几乎都可以用一个模式高效求解,即都采用从后往前的方法比较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 }

    得到输出为:

  • 相关阅读:
    如何关闭内存自动释放池ARC
    你怀疑过“温水煮青蛙”的故事吗
    程序员应该加入的3个QQ群
    简述Oracle 11g 新特性
    ViewState、UpdatePanel及控件OnPre之间的纠葛
    今天,我看到一组图解释“ 什么是博士?”
    Java将何去何从
    给新手朋友 推荐几本书(从C#入门到SQL及设计模式)
    最新版 智能电脑键盘屏幕全记录 免费下载
    C#中两个问号和一个问号
  • 原文地址:https://www.cnblogs.com/General-up/p/5396193.html
Copyright © 2020-2023  润新知