Если reg_timestamp
- это просто время в секундах с начала эпохи, и вы хотите отсортировать записи в порядке убывания, все, что вам нужно сделать, это:
int compare_sched_item_time (const void *a, const void *b)
{
/* cast pointers to adjacent elements to struct ScheduleItem* */
struct ScheduleItem *x = a, *y = b;
/* (x->time < y->time) - (x->time > y->time) - descending sort
* comparison avoids potential overflow
*/
return (x->reg_timestamp < y->reg_timestamp) -
(x->reg_timestamp > y->reg_timestamp);
}
Примечание: Различие условных выражений позволяет избежать возможности переполнения.Вы можете использовать его с любым числовым типом.Формы:
/* (a > b) - (a < b) - ascending sort */
и
/* (a < b) - (a > b) - descending sort */
Просто продумайте все случаи.Для возрастания, если (a > b)
имеет значение true (например, 1
), а (a < b)
- false (например, 0
), ваше условие равно 1 - 0 = 1
, поэтому b
сортируется до a
.Если они равны, результат равен 0
(обмен не требуется).Если (a > b)
равно false и (a < b)
true, то результат равен -1
, поэтому a
сортируется до b
- точно так же, как результаты strcmp
и т. Д.
Edit - Сравнение, если reg_timestamp
Значения равны
Если у вас есть более одного условия, по которому вы хотите отсортировать, просто протестируйте в порядке убывания важности, например,
int compare_sched_item_time (const void *a, const void *b)
{
/* cast pointers to adjacent elements to struct ScheduleItem* */
struct ScheduleItem *x = a, *y = b;
/* (x->time < y->time) - (x->time > y->time) - descending sort
* comparison avoids potential overflow
*/
if (x->reg_timestamp != y->reg_timestamp)
return (x->reg_timestamp < y->reg_timestamp) -
(x->reg_timestamp > y->reg_timestamp);
/* compare dow next */
else if (x->dow != y->dow)
return (x->dow < y->dow) - (x->dow > y->dow);
/* compare hh next */
else if (x->hh != y->hh)
return (x->hh < y->hh) - (x->hh > y->hh);
/* finally compare mm */
else
return (x->mm < y->mm) - (x->mm > y->mm);
}
Это преимущество qsort
.Вы можете сделать любой элемент сортировки любым удобным вам способом, просто возвращая -1, 0, 1
для желаемого условия.