把两个数组合并

①将两个整型升序数据集合A和B合并成一个升序数据集合
例A={3,5,7,8,9,12,16} B={2,4,7,9,11}
结果:C={2,3,4,5,7,7,8,9,9,11,12,16}

#include
#define M 7
#define N 5

#主函数
int main(void)
{
     int a[M]={3,5,7,8,9,12,16};
     int b[N]={2,3,4,5,7,7,8,9,9,11,12,16};
     int c[M+N];
     Merge(a,b,c);
     for(int i = 0;i < M+N;++i){
         printf("5%d\n",c[i]);
     }
     return 0;
}

方法一:

void Merge(int a[],int b[],int c[]){
    int i= 0 , j = 0,k = 0;
    while(ib[j]){
             c[k++] = b[j++];
         }else{
             c[k++] = a[i++];
         }
         if(i

此方法是同时遍历数组a和数组b,取到数组a和b中的元素,分别进行比较,把较小的那一个存放在数组c中,然后继续取元素,继续比较,依次循环,总有一个数组先存放完,以此为循环条件。出循环后判断是哪个数组先完成了存放,然后把未完成存放的继续进行遍历,存入数组c。

方法二:
void Merge(int a[],int b[],int c[]){
   int i = 0,j = 0,k = 0;
   int *s,t,len;
   while(ib[j]){
           c[k++] = b[j++];
       }else{
           c[k++] = a[i++]; 
       }
       if(ib[j]){
           c[k++] = b[j++];
       }else{
           c[k++] = a[i++]; 
       }
       if(i

此方法利用指针s指向没有存放完的数组的元素,这样就可以把方法一中的while语句提出来,提高效率。

方法三:
void Merge(int a[],int b[],int c[]){
    int i = 0,j = 0,k = 0;
    int *s=a,len = M;
    while(ib[j]){
            c[k++] = b[j++];
        }else{
            c[k++] = a[i++];
        }
        if(j

思路:此方法是在方法二的基础上,开始时就假设数组a没有存放完,然后在后面对数组b没有存放完的情况进行判断,如果数组b没存放完则对指针s以及长度len进行改变。简化了代码。

方法四:
void Merge(int a[],int b[],int c[]){
    int i = 0,j = 0,k = 0;
    while(iN || i

思路:此方法代码量少,但是难懂。当数组a和数组b任何一个没有存放完时都继续操作,进行存放。此条件作为进循环的条件。循环里面进行到底是存放a还是存放b的操作。
存放a的条件:
b存放完了||b没存放完&&a没存放完 && a[i] b存放完了||a没存放完 && a[i] 存放b的条件:
b没存放完&&a存放完了||b没存放完&&a[i]>b[j] 时存放b

你可能感兴趣的:(把两个数组合并)