Sortowanie według klasy, a później nazwiska

0

Jak w temacie. To algorytm sortowania według klas, a ja potrzebuje, żeby przy tej samej klasie sortowało według nazwisk

{
                         struct UCZEN x;
                         struct UCZEN y;
                                                  
     int i,j, comp, help;     
     for(j=n-2;j>=0;j--)
     {
                         x=tablica[j];
                         i=j+1;
                         
                         comp=strcmp(x.klasa, tablica[i].klasa);

                         while(i<n && comp>0)
                         {          
                         tablica[i-1]=tablica[i];
                         i++;
                         comp=strcmp(x.klasa, tablica[i].klasa);
                                              
                          }
			 tablica[i-1]=x;
                         }           
0

Ile razy będziesz jeszcze ten sam temat zakładał? Sądzę, że w twoich postach już jest cały standard języka C++ napisany. Albo przeszukaj twoje posty, albo weź sobie książkę.

Odnośnie tematu. Musisz segregować według klasy, potem jak już masz posegregowaną tablicę, potem stworz dodatkową pomocniczą tablicę, i w kolejnej pętli, przekopiuj tych co są w tej samej klasie, i znowu sortuj wedlug nazwisk.

0
MJay napisał(a)

Ile razy będziesz jeszcze ten sam temat zakładał? Sądzę, że w twoich postach już jest cały standard języka C++ napisany. Albo przeszukaj twoje posty, albo weź sobie książkę.

Odnośnie tematu. Musisz segregować według klasy, potem jak już masz posegregowaną tablicę, potem stworz dodatkową pomocniczą tablicę, i w kolejnej pętli, przekopiuj tych co są w tej samej klasie, i znowu sortuj wedlug nazwisk.

Tak to by zrobili frajerzy. Szukam bardziej kreatywnego rozwiązania. Założyłem nowy temat, bo ciągle nikt nie odpowiedział na moje pytanie.

0

Jak chcesz coś kreatywnego, a niekoniecznie najwydajnieszego (chociaż tu nie jestem pewien) to możesz zrobić tak:

  • posortuj niekoniecznie stabilnie (czyli można użyć quicksorta) po nazwiskach,
  • posortuj stabilnie (czyli nie można użyć quicksorta tylko np mergesorta) po klasach,
0

Już mi się udało napisać funkcję sortującą, która sortuje według klasy, a jeżeli są te same klasy to według nazwiska. Nie szukam już odpowiedzi.

0
michaldadej napisał(a)

Już mi się udało napisać funkcję sortującą, która sortuje według klasy, a jeżeli są te same klasy to według nazwiska. Nie szukam już odpowiedzi.

Ale przecież tak zrobiliby frajerzy. Ile ty masz lat?

0
MJay napisał(a)
michaldadej napisał(a)

Już mi się udało napisać funkcję sortującą, która sortuje według klasy, a jeżeli są te same klasy to według nazwiska. Nie szukam już odpowiedzi.

Ale przecież tak zrobiliby frajerzy. Ile ty masz lat?
Mam 18 lat. Nie zrobiłem tak jak on chciał zrobić. Znalazłem inną metodę, żeby za jednym razem sortowało według klasy a potem nazwiska

0

Tak czy owak, złożoność czasowa jest taka sama O(n^2) i to czy będzie sortowało w pętli Od razu czy dopiero w drugiej, to taki sam będzie czas działania.
Nie wiem czemu, ale daję sobie palec uciąć, że twój algorytm sortuje tak jak chcesz w przypadku gdy wpiszesz dwie osoby z klasy, albo więcej w średnim przypadku, natomiast w przypadku pesymistycznym wydaje mi się, że się nie posortuje.
Mam rację?

Sprawdz dla takich danych:
Witold Zamczak 2C 5.0
Wacek Miszczuk 2C 4.0
Jan Kowalski 2C 4.5
Jacek Adamiak 2C 3.0

0
MJay napisał(a)

Tak czy owak, złożoność czasowa jest taka sama O(n^2) i to czy będzie sortowało w pętli Od razu czy dopiero w drugiej, to taki sam będzie czas działania.
Nie wiem czemu, ale daję sobie palec uciąć, że twój algorytm sortuje tak jak chcesz w przypadku gdy wpiszesz dwie osoby z klasy, albo więcej w średnim przypadku, natomiast w przypadku pesymistycznym wydaje mi się, że się nie posortuje.
Mam rację?

Sprawdz dla takich danych:
Witold Zamczak 2C 5.0
Wacek Miszczuk 2C 4.0
Jan Kowalski 2C 4.5
Jacek Adamiak 2C 3.0

Działa. Sprawdzałem na twoich danych. Spróbuj. Poniżej daje ci mój sposób sortowania:

bool swapped; 
                             int comp, comp2;
 
        do {
            swapped = false;
            for (int i = 0; i < n - 1; ++i) 
                {
                comp=strcmp(tablica[i].klasa,tablica[i+1].klasa);
                if (comp>0) 
                {
                    swap(tablica[i], tablica[i + 1]);
                    swapped = true;
                }
                if(comp==0)
                {
                           comp2=strcmp(tablica[i].nazwisko,tablica[i+1].nazwisko);
                           if(comp2>0)
                                      {
                                         swap(tablica[i], tablica[i + 1]);
                                         swapped=true;
                                      }
                           }
            }
        } while (swapped); 

Mam nadzieję, że nie pomyliłem nawiasów przy kopiowaniu

0

Przeciążasz operator '<' i używasz stlowego sorta. Najprostszy i najładniejszy sposób.

0
eryk napisał(a)

Przeciążasz operator '<' i używasz stlowego sorta. Najprostszy i najładniejszy sposób.

Sorry ale nic z tego nie rozumiem. Jestem początkującym. OCB?

0

A po co przeciążać? Można podać komparator przy konkretyzacji szablonu.

0
Wibowit napisał(a)

A po co przeciążać? Można podać komparator przy konkretyzacji szablonu.
Mówicie już jakimś innym językiem niż ja. Wiedzcie, że coś się dzieje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1