Sortowanie za pomocą funkcji bibliotecznej quick-sort

0

Napisałem funkcję sortującą i porównującą liczby w tablicy i pojawił się problem, otóż mam stworzyć tablicę struktur typu Punkt {double x; double y} i mam ją posortować rosnąco według składowej x, a potem malejąco według składowej y. Czyli po prostu muszę napisać dwie nowe funkcje porównujące po x i po y, ale nie mogę sobie z tym poradzić, jakieś pomysły?

0

A nie wystarczy Ci funkcja porównująca i przekazać do niej x lub y a nie całą strukturę?

0

Być może masz rację, ale nie potrafię się za to zabrać,

0

int cmp(const void *a, const void b){
const int
aa=(const int )a;
const int
bb=(const int *)b;
if(*aa==*bb){// aa->x bb -> x (*bb).x
return 0;
}
else if(*aa<*bb){
return -1;
}
else{
return 1;
}

0

no i teraz trzeba dostosować to do tych struktur, do sortowania po x i po y, tutaj moja kreatywność się kończy

0

Kod wrzucaj w znaczniki, ja bym spróbował z czymś takim:
Zakładam że struktura point wygląda u Ciebie +/- tak:

structut Poin
{
int a;
int b;
};

int cmp(const int a, const int b){
if(a>=b)
     return a;
}else{
    return b;
}
}

Wywołanie cmp:

cmp(punkt1.a,puntka.b);

Pisane z palca, mogą być błędy.

0

w c++14. Przerób na c dla wprawy.

sort(vec.begin(), vec.end(), [](auto p1, auto p2) {
    if (p1.x != p2.x)
        return p1.x < p2.x;
    return p1.y > p2.y;
});
0

Mógłby ktoś pomóc to przekształcić, nie jestem obeznany w składni c++

0

Weź się chłopie w garść, miałeś całą logikę wyżej.

int cmp_points(const void *a, const void *b) {
    const struct point *point_a = (struct point *)a;
    const struct point *point_b = (struct point *)b;
    
    if (point_a->x != point_b->x)
        return point_a->x < point_b->x ? -1 : 1;
    if (point_a->y != point_b->y)
        return point_a->y > point_b->y ? -1 : 1;
    return 0;
}
0

mozna prosciej:

int cmp_points(const void *a, const void *b) {
    const struct point *point_a = (struct point *)a;
    const struct point *point_b = (struct point *)b;
 
    if (point_a->x != point_b->x)
        return point_a->x - point_b->x;
    else
        return point_a->y - point_b->y;
}
0

W C jest to bardziej pokręcone. Najlepiej zacząć od jakieś dokumentacji.


int cmpPointByXThenByYNoCast(const struct Point* a, const struct Point* b) {
     if (a->x < b->x) return -1;
     if (a->x > b->x) return 1;
     if (a->y < b->y) return -1;
     if (a->y > b->y) return 1;
     return 0;
}

int cmpPointByXThenByY(const void* a, const void* b) {
    return cmpPointByXThenByYNoCast((struct Point*)a, (struct Point*)b);
}

…
struct Point tab[20];
…

qsort(tab, sizeof(tab)/sizeof(tab[0]), sizeof(tab[0]), cmpPointByXThenByY);

https://wandbox.org/permlink/eu6YtPEzeZcyTdyV

0

Chyba jest niepoprawnie zdefiniowana twoja funkcja

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