Sorting With certain condition

1

I asked the question Who will be disapproved? that had the rule Students would be sorted according to the number of problems solved, with draws sorted according to the alphabetical order of the names (there are no homonyms in the class), Well I managed to solve it but I wanted another way because in that I had to order twice My code

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

struct pessoas
{
 char nome[100];
 int nota;

};

struct pessoas pessoa[102];
void ordena(int teste);
void ordena2(int teste);

int main()
{
  int teste, i, cont = 0;
  while(scanf("%d", &teste) == 1)
  {
      for(i = 0; i < teste; i++)
      {
         scanf("%s %d", pessoa[i].nome, &pessoa[i].nota);
      }

      ordena(teste);
      ordena2(teste);
      printf("Instancia %d\n", ++cont);
      puts(pessoa[teste - 1].nome);
      putchar('\n');
  }
   system("pause");
   return 0;
}

void ordena(int teste)
{
  int i, j , aux;
  char a[100];
  for(i = 0; i < teste; i++)
  {
     for(j = 0; j < teste; j++)
     {
         if(pessoa[i].nota > pessoa[j].nota)
         {
             aux = pessoa[i].nota;
             pessoa[i].nota = pessoa[j].nota;
             pessoa[j].nota = aux;
             strcpy(a, pessoa[i].nome);
             strcpy(pessoa[i].nome, pessoa[j].nome);
             strcpy(pessoa[j].nome, a);
         }
     }
 }
}

 void ordena2(int teste)
 {
    int i, j, aux;
    char a[100];
    for(i = 0; i < teste; i++)
    {
        for(j = i + 1; j < teste; j++)
        {
           if(pessoa[i].nota == pessoa[j].nota)
           {
              if(strcmp(pessoa[i].nome, pessoa[j].nome) > 0)
              {
                strcpy(a, pessoa[i].nome);
                strcpy(pessoa[i].nome, pessoa[j].nome);
                strcpy(pessoa[j].nome, a);
                aux = pessoa[i].nota;
                pessoa[i].nota = pessoa[j].nota;
                pessoa[j].nota = aux;
              }
           }
       }
   }
  }
    
asked by anonymous 21.08.2018 / 02:56

1 answer

1
     if(pessoa[i].nota > pessoa[j].nota)
     {
         aux = pessoa[i].nota;
         pessoa[i].nota = pessoa[j].nota;
         pessoa[j].nota = aux;
         strcpy(a, pessoa[i].nome);
         strcpy(pessoa[i].nome, pessoa[j].nome);
         strcpy(pessoa[j].nome, a);
     }
     else
        if(pessoa[i].nota == pessoa[j].nota)
       {
          if(strcmp(pessoa[i].nome, pessoa[j].nome) > 0)
          {
            strcpy(a, pessoa[i].nome);
            strcpy(pessoa[i].nome, pessoa[j].nome);
            strcpy(pessoa[j].nome, a);
            aux = pessoa[i].nota;
            pessoa[i].nota = pessoa[j].nota;
            pessoa[j].nota = aux;
          }
       }

In this way, I would first see if the note of i was greater than that of j , if it were equal, it would go to that condition.

Your sorting method is selection sort that has complexity of N ^ 2, one of the fastest methods, but a little difficult is the quick sort that has complexity in the best case of Nlog (N). The insertion sort is already a bit easier than QuickSort and has N complexity in the best case.

You can view these methods intuitively at VisuAlgo

Being a QuickSort ready code for your code is quite laborious and so it meant that you tried to do it for yourself.

ORDINATION METHODS

    
21.08.2018 / 03:06