C библиотечная функция для выполнения вида

Действительно ли там какая-либо библиотечная функция доступна в стандартной библиотеке C, чтобы сделать вид?

92
задан jww 15 November 2019 в 22:54
поделиться

6 ответов

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;
}
111
ответ дан 24 November 2019 в 06:28
поделиться

Стандартная библиотека C / C ++ содержит функцию qsort .

Это не лучшая реализация быстрой сортировки в мире, но она достаточно быстрая и ОЧЕНЬ ЛЕГКО в использовании ... формальный синтаксис qsort:

qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);

Единственное, что вам нужно реализовать, это compare_function, которая принимает два аргументы типа "const void", которые можно привести к соответствующей структуре данных, а затем вернуть одно из этих трех значений:

  • отрицательное, если a должно быть перед b
  • 0, если a равно b
  • положительное, если a должно быть после b

1. Сравнение списка целых чисел :

просто приведите a и b к целым числам если x , xy отрицательно, x == y , xy = 0 , x> y ], xy положительно xy - это быстрый способ сделать это :) Обратный * 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 внутри 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;
}
57
ответ дан 24 November 2019 в 06:28
поделиться

Конечно: qsort () - это реализация сортировки (не обязательно быстрой сортировки, как следует из ее названия).

Попробуйте man 3 qsort или прочтите на http://linux.die.net/man/3/qsort

7
ответ дан 24 November 2019 в 06:28
поделиться

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

  • heapsort
  • quicksort
  • mergesort
3
ответ дан 24 November 2019 в 06:28
поделиться

Используйте qsort () в .

@paxdiablo Функция qsort () соответствует ISO / IEC 9899: 1990 («ISO C90»).

4
ответ дан 24 November 2019 в 06:28
поделиться

попробуйте qsort в stdlib.h.

4
ответ дан 24 November 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: