W kodzie masz błąd (IMHO) koncepcyjny. Radził bym zamiast takich karkołomnych aliasów na typ (typedef na tablicę), zrobić strukturę z elementami x i y. Choćby taką:
typedef struct {
double x;
double y;
} Tpoint;
Bardzo polepszy to czytelność kodu bo będziesz wyrażał to co się dzieje w kodzie a nie jakieś przesunięcia o 0 czy 1.
Zakładam jednak "że kazali" :-/ Więc nie będę polemizował.
Drugim problemem który tu widzę, to brak wydzielonych funkcji jasno pokazujących poprzez swoją nazwę co się dzieje w kodzie.
Trzeci problem to pomieszanie nazw angielskich z polskimi. Trochę boli od tego głowa :-/
Jeśli chcesz posortować dane, lepiej to wyrazić bezpośrednio. Np. tak:
#include <stdio.h>
#include <stdlib.h>
typedef double Tpoint[2];
typedef Tpoint Tpoints[];
int cmp_x(const void * v1, const void * v2) {
Tpoint *arg1 = (Tpoint*) v1;
Tpoint *arg2 = (Tpoint*) v2;
if((*arg1)[0] < (*arg2)[0]) {
return -1;
} else if((*arg1)[0] == (*arg2)[0]) {
return 0;
}
return 1;
}
int cmp_y(const void * v1, const void * v2) {
Tpoint * arg1 = (Tpoint*) v1;
Tpoint * arg2 = (Tpoint*) v2;
if((*arg1)[1] < (*arg2)[1]) {
return -1;
} else if(arg1[1] == arg2[1]) {
return 0;
}
return 1;
}
void show_points(const Tpoints points, size_t size) {
for(size_t i = 0; i < size; ++i) {
printf("x = %5.2f y = %5.2f\n", points[i][0], points[i][1]);
}
}
int main(void) {
Tpoints points = {{7,2}, {3,13}, {11,4}, {14,8}, {5,10}, {0,9},
{6,16}, {14,1}, {3,17}, {7,8}};
const size_t points_len = sizeof(points) / sizeof(*points);
puts("Pierwotne:");
show_points(points, points_len);
puts("Posortowane względem x:");
qsort(&points, points_len, sizeof(*points), cmp_x);
show_points(points, points_len);
puts("Posortowane względem y:");
qsort(&points, points_len, sizeof(*points), cmp_y);
show_points(points, points_len);
return EXIT_SUCCESS;
}
Napisałem to trochę szkolnie abyś zobaczył o co chodzi z funkcją porównującą.