2014-11-02 3 views
3

У меня 3 массива: A, B, и С:как сортировать 3 массивы вместе в C

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

Я хочу вышеуказанные 3 массивы (которые имеют один и тот же п # элементов) для сортировки одновременно. Если я отсортировать массив B от самого низкого до самого высокого значения, то я хочу массивов и C следовать Б рисунка. это, возможно, лучше объясняет приведенным ниже примером.

У меня есть код ниже при попытке этого, Мой вопрос: как я могу отредактировать/исправить свой код, чтобы выполнить эту функцию симуляционной сортировки, которая описана ниже?

Unsorted Список:

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

Затем я хочу, чтобы отсортировать B [я] от низшего к высшему, в то время как А [я] & C [я] являются отсортировано по 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 

Тогда, если есть одинаковые/одни и те же номера в B [I], то я хочу, чтобы отсортировать С [я] от низшего к высшему вызывает А [я] и B [I] должны быть отсортированы в соответствии с 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 

Тогда, если 2 имена из а [я] имеют сходство в в [I] и C [i], а затем сортировать A [i] в алфавитном порядке.

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

Я написал код, чтобы попытаться сделать это, но я имею немного борьбы в результате чего 1 массив simulatanuosly сортировки в другой массив. Может ли кто-нибудь указать, что я делаю неправильно, или описать лучший/лучший способ сделать этот тип сортировки?

#include <stdio.h> 

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<6;i++){ 

      if(B[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]); 
     } 


} 

Вывод кода:

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 

Благодаря

+2

Почему вы не свапирований элементы '' Ā' и C' в так же как и для 'B' (хотя замена' A' потребует строкового копирования вместо простого назначения)? – Dmitri

+3

Я подозреваю, что лучшим решением здесь может быть один массив структур. – ooga

+1

Массив структур с qsort был бы намного лучше, но для исправления выбора пузыря не потребовалось бы многого. – Dmitri

ответ

1

это лучше заменить индекс (или указатель), а не заменять каждый элемент в таком случае.

#include <stdio.h> 
#include <stdbool.h> 
#include <string.h> 

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

Вы пропустили комментарий на 'A, B, C)) {// проверьте need'. Исправлена. –

+0

@ DavidC.Rankin О, я пропал без вести. Я благодарю вас за указание на исправление. – BLUEPIXY

+0

спасибо @ DavidC.Rankin, попробуем это. – Quest

2

Я бы использовал простую функцию сортировки, такую ​​как сортировка вставки.В основном вы хотите использовать все свои сравнения в функции сортировки в массиве, которые вы хотите отсортировать, и другие.

В этом случае сравнение будет сделано для B. Единственного оставшейся части должны сделать точно такой же свопы А и С, которые вы сделали с В.

Посмотрите на код ниже, он будет печатать вывода, который вы хотите на первом этапе. Остальные шаги следуют той же идее.

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

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; i<size; ++i) { 
     j=i; 
     while(j>0 && 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]); 
} 

ВЫВОД:

работы с:

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

После рода:

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

спасибо @Zaphod, попробуем это – Quest

6

Все остальные ответы правильны, указывая на то, что вы не поменяться A и C правильно. Но я постараюсь ответить на вопрос «что это лучший способ». В идеале, поскольку ваши массивы A, B и C связаны друг с другом, вы должны использовать массив структур вместо 3 отдельных массивов. Я не знаю, если вы узнали о еще структурах, но вот пример того, как я хотел бы переписать код с помощью:

структур
#include <stdio.h> 
#include <stdbool.h> 

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<DIM(people);i++) 
     printf("%s\t%d\t%d\n", people[i].name, people[i].age, people[i].group); 

    // Here I used a bubble sort since it seemed like what you were doing. 
    n = DIM(people)-1; 
    while (1) { 
     bool swapped = false; 
     for (i=0;i<n;i++) { 
      if (people[i].age > 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<DIM(people);i++) 
     printf("%s\t%d\t%d\n", people[i].name, people[i].age, people[i].group); 
} 
Смежные вопросы