Есть ли какая-либо функция библиотеки, доступная в стандартной библиотеке C для сортировки?
Функция библиотеки C для сортировки
Ответ 1
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;
}
Ответ 2
Стандартная библиотека C/С++ <stdlib.h>
содержит функцию qsort
.
Это не лучшая быстрая сортировка в мире, но она достаточно быстро и ОЧЕНЬ EASY для использования... формальный синтаксис qsort:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
Единственное, что вам нужно реализовать, это compare_function, который принимает два аргументы типа "const void", которые могут быть отнесены к соответствующей структуре данных, а затем верните одно из этих трех значений:
- отрицательный, если a должен быть до b
- 0, если a равно b
- положительный, если a должен быть после b
1. Сравнение списка целых чисел:
просто добавьте a и b в целые числа
если x < y
, x-y
отрицательно, x == y
, x-y = 0
, x > y
, x-y
является положительным
x-y
- это быстрый способ сделать это:)
reverse *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>
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;
}
Ответ 3
Наверняка: qsort()
- это реализация рода (не обязательно quicksort, как может показаться его имя).
Попробуйте man 3 qsort или прочитайте http://linux.die.net/man/3/qsort
Ответ 4
попробуйте qsort
в stdlib.h.
Ответ 5
Используйте qsort() в stdlib.
@paxdiablo Функция qsort() соответствует ISO/IEC 9899: 1990 (`` ISO C90 '').
Ответ 6
Пока не в стандартной библиотеке, https://github.com/swenson/sort имеет только два файла заголовка, которые вы можете включить, чтобы получить доступ к большому диапазону невероятно быстрые сортировки сортировки, например:
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP(x, y) ((x) - (y)) #include "sort.h" /* You now have access to int64_quick_sort, int64_tim_sort, etc., e.g., */ int64_quick_sort(arr, 128); /* Assumes you have some int *arr or int arr[128]; */
Это должно быть как минимум в два раза быстрее, чем стандартная библиотека qsort
, поскольку она не использует указатели на функции и имеет множество других вариантов алгоритма сортировки на выбор.
Он в C89, поэтому должен работать в основном каждый компилятор C.
Ответ 7
В stdlib.h
имеется несколько функций сортировки C. Вы можете сделать man 3 qsort
на unix-машине, чтобы получить список из них, но они включают в себя:
- пирамидальная сортировка
- быстрая сортировка
- слияние