Сортировка массива структур по 2 параметрам
У меня есть структура
struct employee {
int record;
int ID;
....
};
employee * arr = (employee*) malloc(501 * sizeof (employee));
И мне нужно отсортировать его по этим двум параметрам (ID сначала и запись как второй). Я использую стандартный Qsort с
qsort (employee, records, sizeof(employee), compare);
Но я не знаю, как отредактировать базовую функцию сравнения, чтобы она работала
У меня так же
int comparestruct(const employee *p1, const employee *p2)
{
const struct employee *elem1 = p1;
const struct employee *elem2 = p2;
if ( elem1->ID < elem2->ID)
return -1;
else if (elem1->ID > elem2->ID)
return 1;
else
return 0;
}
Но это не работает...
Любая помощь, пожалуйста?
1 ответ
Решение
Обычный способ будет что-то вроде:
int comparestruct(const void *a_, const void *b_) {
const struct employee *a = a_;
const struct employee *b = b_;
int rv = a->ID - b->ID;
if (rv == 0) rv = a->record - b->record;
return rv;
}
Конечно, в этом есть небольшая ошибка, если вычитания могут переполниться (что зависит от диапазона ваших идентификаторов и номеров записей). Если это является возможной проблемой, вам может потребоваться:
int comparestruct(const void *a_, const void *b_) {
const struct employee *a = a_;
const struct employee *b = b_;
if (a->ID < b->ID) return -1;
if (a->ID > b->ID) return 1;
if (a->record < b->record) return -1;
if (a->record > b->record) return 1;
return 0;
}
вместо