2015-06-16 5 views
2

Я столкнулся с проблемой. У меня есть данные по связанному списку структур. Переместить данные в массив структур, затем отсортировать его с помощью qsort() или использовать сортировку слияния? Это структура:Это быстрее, сортировка массива структур или сортировка списка структур C?

struct properties{ 
    char *path; 
    char *name; 
    char *extension; 
    long int size; 
    long unsigned created; 
    long unsigned modified; 
    long unsigned access; 
    int permissions; 
}; 
+0

Как вы выражаете "список" в коде? Это «массив» по ​​сравнению с «списком» или «qsort» и «сортировкой слияния»? –

+0

Не могли бы вы прояснить это на примере? –

+0

Вы знаете, как сортировать структуру? Как вы можете перемещать char, long int данные в одном массиве? Это невозможно. –

ответ

3

Я хотел бы создать массив указателей на структуры и отсортировать массив указателей с помощью qsort. Использование указателей для копирования всех структур будет использовать меньше памяти.

Создать компаратор как это:

int propertyComparator(const void *s1, const void* s2) { 
    struct property *p1 = (struct property *)s1, *p2 = (struct property *)s2; 

    /* compare p1 and p2, below is just an example */ 
    int result = strcmp(p1->name, p2->name); 
    return result; 
} 

Называйте это как это:

struct property *array; 
/* add code to allocate and create array */ 
qsort(array, num_elements, sizeof array, propertyComparator); 

Edit:

Если вы хотите иметь упорядоченный связанный список, сортировка слиянием о настолько быстро. Кажется, это зависит от того, насколько фрагментирован связанный список. https://stackoverflow.com/a/1525419/646887

Причина, по которой я предпочитаю qsort, состоит в том, что она является частью C lib, поэтому мне не нужно писать и поддерживать столько кода. И это всегда быстрый выбор.

+0

Спасибо всем за ваши ответы. Klas Lindbäck, ваш ответ очень информативен. Означает ли это, что l пересекает все элементы списка и получает указатель на каждый элемент, хранящий их в массиве? –

+0

Да. И если вы не знаете размер, вам нужно пройти его дважды. Сначала вычислить размер, а затем собрать указатели. –

Смежные вопросы