Функция библиотеки C для сортировки
Есть ли в стандартной библиотеке C функция библиотеки для сортировки?
9 ответов
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;
}
C/C++ стандартная библиотека <stdlib.h>
содержит qsort
функция.
Это не лучшая реализация быстрой сортировки в мире, но она достаточно быстрая и ОЧЕНЬ ПРОСТОТА для использования... формальный синтаксис qsort:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
Единственное, что вам нужно реализовать - это сравнение_функция, которая принимает два аргумента типа "const void", которые можно привести к соответствующей структуре данных, а затем вернуть одно из этих трех значений:
- отрицательно, если а должно быть до б
- 0, если равно b
- положительный, если а должен быть после б
1. Сравнение списка целых чисел:
просто приведите a и b к целым числам, если 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>
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;
}
Наверняка: qsort()
это реализация сортировки (не обязательно быстрая сортировка, как можно предположить из ее названия).
Попробуйте man 3 qsort или прочитайте на http://linux.die.net/man/3/qsort
Хотя это не входит в стандартную библиотеку, 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.
Я думаю вы ищите.
функция - это реализация алгоритма быстрой сортировки, найденного в
stdlib.h
в
C/C++
.
Вот синтаксис для вызова функции:
void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));
Список аргументов:
база : указатель на первый элемент или базовый адрес массива
nmemb : количество элементов в массиве
размере : размер в байтах каждого элемент
COMPAR : функциякоторая сравнивает два элемента
Вот пример кода, который используется для сортировки массива:
#include <stdio.h>
#include <stdlib.h>
int arr[] = { 33, 12, 6, 2, 76 };
// compare function, compares two elements
int compare (const void * num1, const void * num2) {
if(*(int*)num1 > *(int*)num2)
return 1;
else
return -1;
}
int main () {
int i;
printf("Before sorting the array: \n");
for( i = 0 ; i < 5; i++ ) {
printf("%d ", arr[i]);
}
// calling qsort
qsort(arr, 5, sizeof(int), compare);
printf("\nAfter sorting the array: \n");
for( i = 0 ; i < 5; i++ ) {
printf("%d ", arr[i]);
}
return 0;
}
Вы можете ввести
man 3 qsort
в терминале Linux / Mac, чтобы получить подробную информацию о
qsort
.
Ссылка на страницу руководства qsort
Использование qsort()
в <stdlib.h>
,
@paxdiablo
The qsort()
функция соответствует ISO/IEC 9899:1990 (``ISO C90'').
Есть несколько функций сортировки C, доступных в stdlib.h
, Ты можешь сделать man 3 qsort
на Unix-машине, чтобы получить их список, но они включают в себя:
- пирамидальная сортировка
- быстрая сортировка
- Сортировка слиянием