Сортировка массива структур по 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;
}

вместо

Другие вопросы по тегам