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?
Répondre
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à.
while (true)? En outre, que se passe-t-il lorsqu'un index est hors limites? – pbos
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++];
}
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;
}
É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). –
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));
Je pourrais vivre avec 'input1' et 'input2' mais pas 'sz1', 'sz2' et 'sz3' ... – foraidt
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/
}
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++. –
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]);
}
}
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'? –
- 1. Comment fusionner deux tableaux dans un plist?
- 2. Comment fusionner des sous-tableaux dans un tableau dans Ruby?
- 3. Comment synchroniser deux tables MySQL ayant des structures différentes?
- 4. fusionner deux tableaux basés sur array1
- 5. PHP - Fusionner deux tableaux (de même longueur) en un associatif?
- 6. Comment trier des tableaux dans un tableau?
- 7. php fusionner des tableaux
- 8. Recherche des valeurs dans un tableau ayant le plus d'occurrences
- 9. Fusionner deux tableaux en tant que paires de valeurs clés dans PHP
- 10. fusionner deux ensemble de valeurs de tableau dans un tableau multidimensionnel
- 11. Comparer deux tableaux ou arrays, trouver des valeurs similaires et différentes
- 12. Fusionner efficacement des tableaux de chaînes dans .NET, en conservant des valeurs distinctes
- 13. Fusionner deux listes d'objets qui contiennent des données différentes
- 14. Différence de pourcentage entre différentes valeurs dans les mêmes clés de deux tableaux différents
- 15. Ajouter des valeurs de tableaux à un tableau?
- 16. Fusionner deux (ou plusieurs) tableaux et conserver les valeurs les plus élevées?
- 17. C# Object Array CopyTo lie les valeurs des deux tableaux?
- 18. Comment fusionner deux objets?
- 19. Comment changer les valeurs de tableaux de différentes classes?
- 20. Kohana 3.x ORM: fusionner deux entités différentes en un seul tableau ordonné par timestamp
- 21. Comment fusionner deux projets Delphi?
- 22. Fusionner des plages chevauchantes dans des tableaux PHP?
- 23. fusionner deux tableaux, tout en maintenant les touches numériques
- 24. Fusionner tous les sous-tableaux avec des éléments mutuels dans un sous-tableau
- 25. PHP fusionner des tableaux en 2D JSON
- 26. Comment obtenir des valeurs distinctes d'un tableau de différentes tailles?
- 27. Pousser des tableaux multidimensionnels dans un tableau?
- 28. comparer deux tableaux de différentes longueurs et Afficher les différences
- 29. Fusionner deux cellules de tableau HTML
- 30. Comment puis-je fusionner deux enregistrements Doctrine sans valeurs nulles remplaçant les valeurs existantes?
dupliquer http://stackoverflow.com/questions/1696074/how-can-i-concatenate-two-arrays-in-c – Naveen
osama vous pouvez éditer l'ancienne question au lieu d'en soumettre une nouvelle. –
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