Сортировка данных из структуры по алфавиту? [Дубликат]

Мне потребовалось много времени, чтобы понять это, поэтому на случай, если кому-то это понадобится ...

Это основано на методе SQL 2005 в ответе Аарона и использовании его функции SplitInts (я просто удалил delim param, так как я всегда буду использовать запятые). Я использую SQL 2008, но мне нужно что-то, что работает с типизированными наборами данных (XSD, TableAdapters), и я знаю, что строковые параметры работают с ними.

Я пытался заставить его функцию работать в "где (1,2,3) ", и не повезло прямолинейным способом. Поэтому я сначала создал временную таблицу, а затем сделал внутреннее соединение вместо «где в». Вот мой пример использования, в моем случае я хотел получить список рецептов, которые не содержат определенных ингредиентов:

CREATE PROCEDURE dbo.SOExample1
    (
    @excludeIngredientsString varchar(MAX) = ''
    )
AS
    /* Convert string to table of ints */
    DECLARE @excludeIngredients TABLE (ID int)
    insert into @excludeIngredients
    select ID = Item from dbo.SplitInts(@excludeIngredientsString)

    /* Select recipies that don't contain any ingredients in our excluded table */
   SELECT        r.Name, r.Slug
FROM            Recipes AS r LEFT OUTER JOIN
                         RecipeIngredients as ri inner join
                         @excludeIngredients as ei on ri.IngredientID = ei.ID
                         ON r.ID = ri.RecipeID
WHERE        (ri.RecipeID IS NULL)
75
задан user1526667 27 July 2012 в 02:57
поделиться

6 ответов

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

6
ответ дан abyx 25 August 2018 в 16:43
поделиться

Хотя в стандартной библиотеке нет, 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.

3
ответ дан Christopher Swenson 25 August 2018 в 16:43
поделиться

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

  • heapsort
  • quicksort
  • mergesort
2
ответ дан dj2 25 August 2018 в 16:43
поделиться

Использовать qsort () в stdlib.

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

3
ответ дан prime_number 25 August 2018 в 16:43
поделиться

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;
}
95
ответ дан rerun 25 August 2018 в 16:43
поделиться

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

Это не лучшая быстрая реализация сортировки в мире, но она достаточно быстро и ОЧЕНЬ ЛЕГКО для использования ... формальная Синтаксис 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 to *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;
}
52
ответ дан whacko__Cracko 25 August 2018 в 16:43
поделиться
Другие вопросы по тегам:

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