Есть ли в стандартной библиотеке C какая-либо библиотечная функция для сортировки?
Есть ли в стандартной библиотеке C какая-либо библиотечная функция для сортировки?
Ответы:
qsort()
это функция, которую вы ищете. Вы вызываете его с помощью указателя на ваш массив данных, количества элементов в этом массиве, размера каждого элемента и функции сравнения.
Он творит свое волшебство, и ваш массив сортируется на месте. Пример ниже:
#include <stdio.h>
#include <stdlib.h>
int comp (const void * elem1, const void * elem2)
{
int f = *((int*)elem1);
int s = *((int*)elem2);
if (f > s) return 1;
if (f < s) return -1;
return 0;
}
int main(int argc, char* argv[])
{
int x[] = {4,5,2,3,1,0,9,8,6,7};
qsort (x, sizeof(x)/sizeof(*x), sizeof(*x), comp);
for (int i = 0 ; i < 10 ; i++)
printf ("%d ", x[i]);
return 0;
}
return (f > s) - (f < s);
qsort
Функция« Пункт 4 »Если два элемента сравниваются как равные, их порядок в результирующем отсортированном массиве не указан».
Стандартная библиотека C / C ++ <stdlib.h>
содержит qsort
функцию.
Это не лучшая реализация быстрой сортировки в мире, но она достаточно быстрая и ОЧЕНЬ ЛЕГКАЯ для использования ... формальный синтаксис qsort:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
Единственное, что вам нужно реализовать, это функция compare_function, которая принимает два аргумента типа «const void», которые могут быть преобразованы в соответствующую структуру данных, а затем возвращать одно из этих трех значений:
1. Сравнение списка целых чисел :
просто бросить а и Ь в целые числа , если это x < y
, x-y
имеет отрицательное значение , x == y
, x-y = 0
, x > y
, x-y
положительный
x-y
ярлык способ сделать это :) обратным , *x - *y
чтобы *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>
библиотеки.
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;
}
int
значения, переданные в компаратор, int *
замаскированы под void *
. char *
Таким образом, при сортировке массива значения, переданные в компаратор, char **
замаскированы как void *
. Таким образом, правильный код должен быть: int compare_function(const void *a,const void *b) { return (strcmp(*(char **)a, *(char **)b)); }
.
if (x > y) return +1; else if (x < y) return -1; else return 0;
, или, если вам нужно простое выражение, тогда return (x > y) - (x < y);
. Это всегда оценивает два сравнения на уровне C, но оптимизатор может этого избежать. Вычитание не работает для значений без знака. Первая версия хорошо работает, когда вы имеете дело с серией сравнений - сначала сравниваете 2 целочисленных члена структуры, и если они равны, то два двойных, затем две строки и т.д. в C, а также в Perl.
Конечно: qsort()
это реализация сортировки (не обязательно быстрой сортировки, как следует из названия).
Попробуйте man 3 qsort или прочтите http://linux.die.net/man/3/qsort
qsort
не обязательно реализовывать с помощью Quicksort.
Хотя он и не входит в стандартную библиотеку, https://github.com/swenson/sort имеет только два файла заголовков, которые вы можете включить, чтобы получить доступ к широкому спектру невероятно быстрых маршрутов сортировки, например:
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP ( x , y ) (( x ) - ( y )) #include "sort.h" / * Теперь у вас есть доступ к int64_quick_sort, int64_tim_sort и т. д., например, * / int64_quick_sort ( обр. , 128 ); / * Предполагается, что у вас есть int * arr или int arr [128]; * /
Это должно быть как минимум в два раза быстрее, чем стандартная библиотека qsort
, поскольку она не использует указатели на функции и имеет множество других вариантов алгоритма сортировки на выбор.
Он находится на C89, поэтому должен работать практически во всех компиляторах C.
попробуйте qsort
в stdlib.h.
Используйте qsort()
в <stdlib.h>
.
@paxdiablo qsort()
Функция соответствует ISO / IEC 9899: 1990 (`` ISO C90 '').
Есть несколько функций сортировки C, доступных в stdlib.h
. Вы можете сделать man 3 qsort
на машине unix, чтобы получить их список, но они включают: