【问题标题】:Which is faster, sorting an array of structs or sorting a list of structures C?排序结构数组或排序结构列表 C 哪个更快?
【发布时间】:2015-09-01 03:16:42
【问题描述】:

我面临着挑战。我有关于结构链接列表的数据。将数据移动到结构数组中,然后使用 qsort() 对其进行排序还是使用归并排序? 这是结构:

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

【问题讨论】:

  • 如何在代码中表示“列表”?是“数组”与“列表”还是“qsort”与“合并排序”?
  • 你能举个例子说明一下吗??
  • 你知道如何对结构进行排序吗?如何在单个数组上移动 char、long int 数据?这是不可能的。
  • 最好的方法可能是将链表实现为数组,而不是完全动态的列表。然后排序变得微不足道。或者,您可以考虑将链表与基于指针的查找表集成,以便链表中的每个项目都可以获得索引。
  • C 中可用的 qsort() 可以对数组进行排序。它只需要您指定要使用的排序标准。您编写了一个比较器函数并将其指针提供给 qsort()。

标签: c arrays list sorting


【解决方案1】:

我将创建一个指向结构的指针数组,并使用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);

编辑:

如果你想要一个排序的链表,mergesort 的速度差不多。似乎这取决于链表的碎片化程度。 见https://*.com/a/1525419/646887

我更喜欢qsort 的原因是它是C lib 的一部分,所以我不必编写和维护这么多代码。而且它总是一个快速的选择。

【讨论】:

  • 谢谢大家的回答。 Klas Lindbäck 您的回答内容丰富。是不是意味着 l 遍历列表的所有元素,并获取指向每个元素的指针,将它们存储在数组中?
  • 是的。如果你不知道你需要遍历它两次的大小。先计算大小,再收集指针。