如何在C中对链表进行排序?

时间:2009-10-24 19:46:43

标签: c sorting linked-list

我需要能够按字母顺序对条目进行排序或插入。有没有办法做到这一点?

9 个答案:

答案 0 :(得分:6)

mergesort对排序很好(当然,如果那就是你所要求的那样,已排序列表中的插入更简单了。)

答案 1 :(得分:2)

您可以在libc中使用qsort()函数。基本上,你将创建一个指向节点的指针数组,并编写一个节点比较函数......然后调用qsort(),最后按照qsort()指定的新顺序重新创建列表。

答案 2 :(得分:1)

可以为单链接列表实现quicksort的版本,但通常这只是一个有趣的谜题,因为mergesort更容易实现并且同样有效(或更好)用于排序链表。

答案 3 :(得分:1)

插入很简单,只需逐步浏览列表,直到找到正确的位置,将新节点放在那里(前一节点现在链接到新节点,新节点指向前一节点先前指向的节点)。 / p>

如果您已经有一个未排序的列表,则没有有效的方法在列表中对其进行排序,这意味着您必须创建第二个集合并在那里进行排序,例如使用二叉树或数组和快速排序。

答案 4 :(得分:1)

如果您的列表已经排序并且想要插入整批项目,那么最好在开头插入它们并在之后排序;如果你想插入只有几个项目,最好保持列表排序。

我的推理:

  • 开头的插入是O(1);
  • 保持列表排序的插入是O(N);
  • 对列表进行排序为O(N log N)(充其量)

因此,上面的所有项目 记录N项或更多只有少数项小于记录N项

答案 5 :(得分:0)

您可能希望从手工排序开始,并了解如何排序,然后,看看是否可以使用伪代码编写。从那里可以很容易地将其转换为程序。

要获得家庭作业的帮助,如果您解释如何进行排序,显示一些不起作用的代码,并解释它应该做什么以及它正在做什么,这会有所帮助,然后您可以找到更多帮助即将。

由于您使用的是链接列表,如果您可以使用二叉树,那么二进制排序,特别是如果您可以在插入时进行排序,那将是您最好的选择。

答案 6 :(得分:0)

理想情况下,尝试在插入新项目时对链接列表进行排序。

但是,这个问题在以下StackOverflow帖子中以某种方式得到了回答:

Inserting a node into a linked list in constant-time?

How do you insert into a sorted linked list?

Sort a singly Linked list

What’s the fastest algorithm for sorting a linked list?

Sorting a linked list

答案 7 :(得分:0)

这不是你应该重新实现的东西(除非这是一个家庭作业问题......)。我使用glib,它实现了一个链表和排序插入,所以你不必这样做。这是appropriate glib documentation

答案 8 :(得分:0)

如果您的列表是双向链接的,您可以将其转换为二叉树,然后再次返回链接列表。

这不需要辅助存储。

Sorting a linked list by turning it into a binary tree