Функция библиотеки 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.

Использование qsort() в <stdlib.h>,

@paxdiablo The qsort() функция соответствует ISO/IEC 9899:1990 (``ISO C90'').

Есть несколько функций сортировки C, доступных в stdlib.h, Ты можешь сделать man 3 qsort на Unix-машине, чтобы получить их список, но они включают в себя:

  • пирамидальная сортировка
  • быстрая сортировка
  • Сортировка слиянием

Источник GNU qsort в stdlib показывает, что это quicksort.

Другие вопросы по тегам