osama
osama

Reputation: 51

How do I merge two arrays having different values into one array?

Suppose you have one array a[]=1,2,4,6 and a second array b[]=3,5,7. The merged result should have all the values, i.e. c[]=1,2,3,4,5,6,7. The merge should be done without using functions from <string.h>.

Upvotes: 4

Views: 25214

Answers (6)

ashim888
ashim888

Reputation: 206

this is just simple modification of bill fosters answers which would take n dimension array:

    int main(void)
    {
        int m,n;
        int c[100];    
        printf("Enter Size of first Array: \n");
        scanf("%d",&m);
        printf("Enter Size of Second Array: \n");
        scanf("%d",&n);

        int a[m],b[n]; //Declaring array a and b with its size m and n accordingly

        int myval=m+n; //Size of the new array

        for(int i=0;i<m;i++){
            printf("Enter value for first[%d]:",i); 
            scanf("%d",&a[i]);
        }

        for(int i=0;i<m;i++){
            printf("Enter value for Second[%d]:",i);    
            scanf("%d",&b[i]);
        }

        int nbr_a = sizeof(a)/sizeof(a[0]); //this gives the actual size of an array
        int nbr_b = sizeof(b)/sizeof(b[0]);
        int i=0, j=0, k=0;

        // Phase 1) 2 input arrays not exhausted
        while( i<nbr_a && j<nbr_b )
        {
            if( a[i] <= b[j] )
                c[k++] = a[i++];
            else
                c[k++] = b[j++];
        }

        // Phase 2) 1 input array not exhausted
        while( i < nbr_a )
            c[k++] = a[i++];
        while( j < nbr_b )
            c[k++] = b[j++];

        for(i=0;i<myval;i++){
            printf("c[%d]:%d\n",i,c[i] );
        }
    }

Upvotes: 0

soullessgod
soullessgod

Reputation: 1

Merging 2 unsorted integer arrays:

void main()
{
    clrscr();
    int A[10],B[10],C[26],a,b,n1,n2;
    cout<<"\n enter limit for array1     ";
    cin>>n1;
    cout<<"\n enter limit for array2     ";
    cin>>n2;
    a=0;b=0;int i=0;
    clrscr();
    while(1)
    {
        if(a<n1)
        {
            cout<<"\n enter element "<<a+1<<"for array1   ";
            cin>>A[a];
            clrscr();
            a++;
        }
        if(b<n2)
        {
            cout<<"\n enter element "<<b+1<<"for array2  ";
            cin>>B[b]; clrscr();
            b++;
        }
        if(a==n1&&b==n2)
            break;
    }
    a=0;b=0;
    cout<<"\n array merged";
    while(1)
    {
        if(a<n1)
        {
            C[a]=A[a];
            a++;
        }
        if(a>=n1&&b<n2)
        {
            C[a]=B[b];
            a++;b++;
        }
        if(a==(n1+n2))
        {
            if(i<(n1+n2))
            {
                cout<<endl<<C[i];
                i++;
            }
            else
                break;
        }
    }
    getch();// \m/
}

Upvotes: 0

Aszarsha
Aszarsha

Reputation: 369

void merge(int *input1, size_t sz1, 
           int *input2, size_t sz2,
           int *output, size_t sz3) {
    int i = 0;
    int index1 = 0, index2 = 0;

    while (i < sz3 && index1 < sz1 && index2 < sz2)
        if (input1[index1] <= input2[index2])
            output[i++] = input1[index1++];
        else
            output[i++] = input2[index2++];

    if (index1 < sz1)
        for (; i < sz3 && index1 < sz1; ++i, ++index1)
            output[i] = input1[index1];
    else if (index2 < sz2)
        for (; i < sz3 && index2 < sz2; ++i, ++index2)
            output[i] = input2[index2];
}

which you use that way:

#define TAB_SIZE(x) (sizeof(x)/sizeof(*(x)))

int tab1[] = { 1, 2, 4, 6 };
int tab2[] = { 3, 5, 7 };

int tabMerged[TAB_SIZE(tab1)+TAB_SIZE(tab2)];
merge(tab1, TAB_SIZE(tab1), tab2, TAB_SIZE(tab2), tabMerged, TAB_SIZE(tabMerged));

Upvotes: 0

Lucas
Lucas

Reputation: 14129

I am learning c myself at them moment, so don't take this as the perfect solution, but maybe you can get some ideas from what I did to solve your own problem.

#include <stdio.h>
#include <stdlib.h>

int compare (const void * first, const void * second){
    return  *(int*)first - *(int*)second ;
}

int main(){
    int a[] = {1,2,4,6};
    int b[] = {3,5,7};
    size_t sizeA =sizeof(a)/sizeof(a[0]);
    size_t sizeB = sizeof(b)/sizeof(b[0]); 
    size_t sizeC = sizeA + sizeB; 
    /*allocate new array of sufficient size*/
    int *c = malloc(sizeof(int)*sizeC);
    unsigned i;
    /*copy elements from a into c*/
    for(i = 0; i<sizeA; ++i){
        c[i] = a[i];
    } 
    /*copy elements from b into c*/
    for(i = 0; i < sizeB; ++i){
        c[sizeA+i] = b[i];
    }
    printf("array unsorted:\n");
    for(i = 0; i < sizeC; ++i){
        printf("%d: %d\n", i, c[i]);
    }
    /*sort array from smallest to highest value*/
    qsort(c, sizeC, sizeof(int), compare);
    printf("array sorted:\n");
    for(i = 0; i < sizeC; ++i){
        printf("%d: %d\n", i, c[i]);
    }
    return 0;
}

Upvotes: 2

Bill Forster
Bill Forster

Reputation: 6297

I haven't compiled and tested the following code, but I am reasonably confident. I am assuming both input arrays are already sorted. There is more work to do to make this general purpose as opposed to a solution for this example only. No doubt the two phases I identify could be combined, but perhaps that would be harder to read and verify;

void merge_example()
{
    int a[] = {1,2,4,6};
    int b[] = {3,5,7};
    int c[100];     // fixme - production code would need a robust way
                    //  to ensure c[] always big enough
    int nbr_a = sizeof(a)/sizeof(a[0]);
    int nbr_b = sizeof(b)/sizeof(b[0]);
    int i=0, j=0, k=0;

    // Phase 1) 2 input arrays not exhausted
    while( i<nbr_a && j<nbr_b )
    {
        if( a[i] <= b[j] )
            c[k++] = a[i++];
        else
            c[k++] = b[j++];
    }

    // Phase 2) 1 input array not exhausted
    while( i < nbr_a )
        c[k++] = a[i++];
    while( j < nbr_b )
        c[k++] = b[j++];
}

Upvotes: 8

Kugel
Kugel

Reputation: 19824

In case the 2 given arrays are sorted:

while (true):
{
    if (a[i] < b[j])
    {
        c[k] = a[i];
        i++;
    } else {
        c[k] = b[j]
        j++
    }
    k++
}

i,j,k are indices and start at zero. Mind you, this code does not check for array lengths. Also you will need to break it when you reach end of both arrays. But is easy to deal with.

If the arrays are not pre-sorted, you can just easily concatenate them and call a search function on them such as BubbleSort or QuickSort. Google those.

Upvotes: 0

Related Questions