2009-11-09 5 views
3

Supposons que vous ayez un tableau a[]=1,2,4,6 et un deuxième tableau b[]=3,5,7. Le résultat fusionné doit avoir toutes les valeurs, c'est-à-dire c[]=1,2,3,4,5,6,7. La fusion doit être effectuée sans utiliser les fonctions <string.h>.Comment fusionner deux tableaux ayant des valeurs différentes dans un tableau?

+0

dupliquer http://stackoverflow.com/questions/1696074/how-can-i-concatenate-two-arrays-in-c – Naveen

+0

osama vous pouvez éditer l'ancienne question au lieu d'en soumettre une nouvelle. –

+0

Pas un doublon. Dans l'autre question, osama (vraisemblablement) a posé des questions sur la concaténation; cette question concerne la fusion de deux tableaux ordonnés. – Thomas

Répondre

1

Dans le cas où les 2 tableaux donnés sont triés:

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

i, j, k sont des indices et commencent à zéro. Rappelez-vous, ce code ne vérifie pas les longueurs de tableau. Aussi, vous aurez besoin de le casser quand vous atteignez la fin des deux tableaux. Mais est facile à traiter.

Si les tableaux ne sont pas pré-triés, vous pouvez simplement les concaténer et appeler une fonction de recherche sur eux comme BubbleSort ou QuickSort. Google ceux-là.

+1

while (true)? En outre, que se passe-t-il lorsqu'un index est hors limites? – pbos

7

Je n'ai pas compilé et testé le code suivant, mais je suis raisonnablement confiant. Je suppose que les deux tableaux d'entrée sont déjà triés. Il y a plus de travail à faire pour rendre cet objectif général, par opposition à une solution pour cet exemple seulement. Il ne fait aucun doute que les deux phases que j'identifie pourraient être combinées, mais peut-être que cela serait plus difficile à lire et à vérifier;

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++]; 
} 
2

J'apprends c moi-même à leur moment, alors ne prenez pas cela comme la solution idéale, mais peut-être que vous pouvez obtenir quelques idées de ce que je l'ai fait pour résoudre votre problème.

#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; 
} 
+0

Étant donné que les tableaux d'entrée sont déjà triés, ils peuvent être fusionnés sans avoir à trier le résultat. Cela devrait être une opération O (N) mais vous avez créé une opération O (N.logN). –

0
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]; 
} 

que vous utilisez cette façon:

#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)); 
+0

Je pourrais vivre avec 'input1' et 'input2' mais pas 'sz1', 'sz2' et 'sz3' ... – foraidt

0

Fusion 2 tableaux d'entiers non triés:

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/ 
} 
+0

Publier du code C++ comme réponse à une question étiquetée C est une valeur discutable. La question n'a jamais été taguée avec C++. –

0

c'est juste une simple modification du projet de loi favorise des réponses qui prendrait la dimension n tableau:

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]); 
     } 
    } 
+0

Est-ce que 'nbr_a' n'est pas identique à' m' et 'nbr_b' à' n'? Et n'est-ce pas un bug que d'entrer des valeurs 'm' au lieu de' n' dans 'b'? –

Questions connexes