Sortowanie tablicy struktur qsort

0

Witam! Potrzebuję posortować tablicę struktur dwóch zmiennych. Wiem, jak zrobić, sortowanie względem pierwszego argumentu, ale nie wiem jak zabrać się za sortowanie drugiego.
(Kod jest większy, ale starałem się zostawić to co niezbędne; tablica jest wypełniona)

struct wczytaj{
  int znak;	
  int ile;
};

int rosnaco (const void * a, const void * b)
{
    int _a = *(int*)a;
    int _b = *(int*)b;
    if(_a < _b) return -1;
    else if(_a == _b) return 0;
    else return 1;
}

int malejaco (const void * a, const void * b)
{
    int _a = *(int*)a;
    int _b = *(int*)b;
    if(_a > _b) return -1;
    else if(_a == _b) return 0;
    else return 1;
}
	
wczytaj tab[256];
qsort(tab,i, sizeof(struct wczytaj), rosnaco);;

 

Po pierwszym qsort ma być jeszcze drugi, który będzie sortował malejąco względem zmiennej tab[].ile .

0

Po pierwszym qsort ma być jeszcze drugi, który będzie sortował malejąco względem zmiennej tab[].ile .
Tyle że drugie sortowanie zniszczy wynik pierwszego, bo quick-sort nie jest stabilny. Musisz od razu sortować względem obu zmiennych.

int rosnaco (const void* a, const void* b)
{
    struct wczytaj* left = (struct wczytaj*)a;
    struct wczytaj* right = (struct wczytaj*)b;
    if (left->x == right->x)
    {
        // sprawdz druga zmienna np.
        if (left->y < right->y) return -1;
        ...
    }
    else
    {
        // sprawdz pierwsza zmienna
    }
}
0

To:

int _a = *(int*)a;
int _b = *(int*)b;
if(_a < _b) return -1;
else if(_a == _b) return 0;
else return 1;

Możesz z powodzeniem zastąpić tym (a nawet prościej jeśli zrobisz rzutowanie w linijce z return):

int _a = *(int*)a;
int _b = *(int*)b;
return (_a -_b)

Co do samego pytania:
Wiem, jak zrobić, sortowanie względem pierwszego argumentu, ale nie wiem jak zabrać się za sortowanie drugiego.

Powinieneś odpowiednio zaznaczyć względem czego chcesz sortować w funkcji, którą podajesz jako argument.

int rosnaco_wzgledem_ile (const void * a, const void * b)
{
    Wczytaj _a = *(Wczytaj*)a;
    Wczytaj _b = *(Wczytaj *)b;
    return (_a.ile -_b.ile)
}

Jak się nigdzie nie pieprznąłem - to o to Ci chodzi ;)

EDIT: Zżarłem < code >

0

WTF?
Dlaczego nie użyjesz funkcji z algorithm? Bedzie i wiele ładniej, prościej, wydajniej.

0

@twonek :
od kiedy w C możesz

struct wczytaj{
  int znak;    
  int ile;
};
...
wczytaj tab[256];

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