comment sortinger 3 tableaux ensemble en C

J’ai 3 tableaux: A, B et C :

char A[6][10]; int B[6]; int C[6]; 

Je veux que les 3 tableaux ci-dessus (qui ont le même nombre d’éléments) soient sortingés simultanément. Si je sortinge le tableau B du plus bas au plus élevé, je veux que les tableaux A et C suivent le modèle de B. ceci est peut-être mieux expliqué avec un exemple ci-dessous.

J’ai un code ci-dessous essayant cela, ma question est comment puis-je éditer / corriger mon code pour faire cette fonction de sorting simultané qui est décrite ci-dessous?

Liste non sortingée:

 A[6] B[6] C[6] John 12 2 David 30 1 Michael 12 2 Steve 12 1 Sam 19 2 Claire 12 1 

Je veux ensuite sortinger B [i] du plus bas au plus élevé , alors que A [i] et C [i] sont sortingés selon B [i]

 A[6] B[6] C[6] John 12 2 Michael 12 2 Steve 12 1 Claire 12 1 Sam 19 2 David 30 1 

Ensuite, s’il existe des nombres identiques / identiques dans B [i] , je souhaite alors sortinger C [i] du plus bas au plus élevé, ce qui provoque le sorting de A [i] et B [i] selon C [i]:

 A[6] B[6] C[6] Steve 12 1 Claire 12 1 John 12 2 Michael 12 2 Sam 19 2 David 30 1 

Ensuite, si 2 noms de A [i] ont des similitudes dans B [i] et C [i] , alors sortingez A [i] par ordre alphabétique.

 A[6] B[6] C[6] Claire 12 1 Steve 12 1 John 12 2 Michael 12 2 Sam 19 2 David 30 1 

J’ai écrit un code pour essayer de faire cela, mais j’ai un peu de mal à faire en sorte qu’un tableau sortinge simulatanuosly en un autre tableau. Quelqu’un peut-il indiquer ce que je fais de travers ou décrire un meilleur / meilleur moyen de faire ce type de sorting?

 #include  main() { char A[6][10]={"John","David","Michael","Steve","Sam","Claire"}; int B[6] = {12,30,12,12,19,12}; int C[6] = {2,1,2,1,2,1}; int i=0; int true=1; for (i=0;i<6;i++) { printf("%s\t%d\t%d\n",A[i],B[i],C[i]); } while(1) { true = 0; for (i=0;i B[i+1]){ int temp = B[i]; B[i] = B[i+1]; B[i+1] = temp; C[i]= C[i+1]; swapped = 1; } } if (true==0){ break; } } printf("\nnew list\n"); for (i=0;i<6;i++) { printf("%s\t%d\t%d\n",A[i],B[i],C[i]); } } 

Sortie du code:

 John 12 2 David 30 1 Michael 12 2 Steve 12 1 Sam 19 2 Claire 12 1 new list John 12 2 David 12 2 Michael 12 1 Steve 12 1 Sam 19 1 Claire 30 1 

Merci

il est préférable de remplacer l’index (ou le pointeur) plutôt que de remplacer chaque élément dans un tel cas.

 #include  #include  #include  bool isDes(int x, int y, char A[][10], int B[], int C[]){ return B[x]>B[y] || B[x]==B[y] && (C[x]>C[y] || C[x]==C[y] && strcmp(A[x], A[y])>0); } int main(){ char A[6][10]={"John","David","Michael","Steve","Sam","Claire"}; int B[6] = {12,30,12,12,19,12}; int C[6] = {2,1,2,1,2,1}; int index[6] = { 0,1,2,3,4,5};//prepare an array of index int i=0; bool swapped; for (i=0;i<6;i++){ printf("%s\t%d\t%d\n",A[i],B[i],C[i]); } while(1){ swapped = false; for (i=0; i<6-1;i++){//i<6 : bad because when i==5 , X[i+1] is out-of-range access if(isDes(index[i], index[i+1], A, B, C)){ //check needs to be replaced. int temp = index[i]; index[i] = index[i+1]; index[i+1] = temp; swapped = true; } } if (swapped==false){ break; } } printf("\nnew list\n\n"); for (i=0;i<6;i++){ printf("%s\t%d\t%d\n",A[index[i]],B[index[i]],C[index[i]]);//indirect reference by index } return 0; } 

Toutes les autres réponses sont correctes en soulignant que vous n’avez pas échangé A et C correctement. Mais je vais essayer de répondre à la question “quelle est la meilleure façon” à la place. Idéalement, étant donné que vos tableaux A, B et C sont tous liés les uns aux autres, vous devriez utiliser un tableau de structures au lieu de 3 tableaux distincts. Je ne sais pas si vous avez encore entendu parler de structs, mais voici un exemple de la façon dont je réécrirais votre code à l’aide de structs:

 #include  #include  typedef struct Person { char name[10]; int age; int group; } Person; #define DIM(a) (sizeof(a)/sizeof(a[0])) main() { Person people[] = { { "John", 12, 2 }, { "David", 30, 1 }, { "Michael", 12, 2 }, { "Steve", 12, 1 }, { "Sam", 19, 2 }, { "Claire", 12, 1 } }; int i=0; int n=0; for (i=0;i people[i+1].age) { Person temp = people[i]; people[i] = people[i+1]; people[i+1] = temp; swapped = true; } } n--; if (!swapped) break; } printf("\nnew list\n"); for (i=0;i 

J’utiliserais une fonction de sorting simple comme un sorting par insertion. Fondamentalement, vous souhaitez baser toutes vos comparaisons dans la fonction de sorting sur le tableau sur lequel vous souhaitez que les autres soient sortingées.

Dans ce cas, les comparaisons seront effectuées pour B. Il ne rest plus qu’à effectuer exactement les mêmes échanges en A et C que vous avez effectués avec B.

Regardez le code ci-dessous, il imprimera la sortie que vous voulez dans la première étape. Les étapes restantes suivent la même idée.

 #include  #include  #include  void sortarray(long size, char A[][10], int B[], int C[]) { long i; long j; char Atemp[10]; int Btemp; int Ctemp; for(i=1; i0 && B[j-1] > B[j]) { Btemp = B[j-1]; B[j-1] = B[j]; B[j] = Btemp; //----> Swap the C and A elements the same way you swapped B Ctemp = C[j-1]; C[j-1] = C[j]; C[j] = Ctemp; strcpy(Atemp, A[j-1]); strcpy(A[j-1], A[j]); strcpy(A[j], Atemp); //----> Swapping of C and A is done j = j-1; } } } int main() { int i; char A[6][10] = {"John", "David", "Michael", "Steve", "Sam", "Claire"}; int B[6] = {12, 30, 12, 12, 19, 12}; int C[6] = {2, 1, 2, 1, 2, 1}; for (i=0;i<6;i++) printf("%s\t%d\t%d\n",A[i],B[i],C[i]); printf("\n"); sortarray(6, A, B, C); for (i=0;i<6;i++) printf("%s\t%d\t%d\n",A[i],B[i],C[i]); } 

SORTIE:

Commencé avec:

 John 12 2 David 30 1 Michael 12 2 Steve 12 1 Sam 19 2 Claire 12 1 

Après le sorting:

 John 12 2 Michael 12 2 Steve 12 1 Claire 12 1 Sam 19 2 David 30 1