Стандартная библиотека C / C ++ <stdlib.h>
содержит функцию qsort
.
Это не лучшая быстрая реализация сортировки в мире, но она достаточно быстро и ОЧЕНЬ ЛЕГКО для использования ... формальная Синтаксис qsort:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
Единственное, что вам нужно реализовать, это compare_function, который принимает два аргумента типа «const void», которые могут быть отнесены к соответствующей структуре данных, а затем верните одно из этих трех значений:
1. Сравнивая список целых чисел:
просто выделяет a и b целые числа, если x < y
, x-y
отрицательный, x == y
, x-y = 0
, x > y
, x-y
положителен x-y
- это короткий путь для этого: reverse *x - *y
to *y - *x
для сортировки в порядке убывания / обратного порядка
int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}
2. Сравнение списка строк:
Для сравнения строки вам нужна функция strcmp
внутри <string.h>
lib. strcmp
будет по умолчанию возвращать -ve, 0, ve соответствующим образом ... сортировать в обратном порядке, просто отменить знак, возвращенный strcmp
#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}
3. Сравнение чисел с плавающей запятой:
int compare_function(const void *a,const void *b) {
double *x = (double *) a;
double *y = (double *) b;
// return *x - *y; // this is WRONG...
if (*x < *y) return -1;
else if (*x > *y) return 1; return 0;
}
4. Сравнение записей на основе ключа:
Иногда вам нужно сортировать более сложные вещи, такие как запись. Вот простейший способ сделать это, используя библиотеку qsort
.
typedef struct {
int key;
double value;
} the_record;
int compare_function(const void *a,const void *b) {
the_record *x = (the_record *) a;
the_record *y = (the_record *) b;
return x->key - y->key;
}