在C中对链接列表进行排序

时间:2011-08-23 22:10:14

标签: c algorithm sorting data-structures linked-list

我被要求编写一个函数,它接受3个未排序的链表并返回一个组合所有三个列表的单个排序链表。您能想到的最佳方式是什么?

我真的没有内存限制,但是如果有/没有内存限制你会做什么?

5 个答案:

答案 0 :(得分:38)

答案 1 :(得分:0)

如果对3个列表进行单独排序,那么问题就很简单了,但是因为它们不是很棘手。

我会编写一个函数,它将排序列表和未排序列表作为参数,遍历未排序列表的每个项目,并依次将其添加到排序列表中的正确位置,直到未排序的项目中没有任何项目列表。

然后简单地创建一个第四个“空”列表,其本质上是空的“已排序”,然后使用每个未排序的列表调用您的方法三次。

将列表转换为数组可以使事情在使用更高级的排序技术方面更有效率,但转换为数组的成本必须考虑并与原始列表的大小相平衡。 / p>

答案 2 :(得分:0)

我在想你可以快速排序。它与合并排序几乎相同,唯一的区别是你首先拆分然后合并,其中whit快速排序你首先“合并”然后你进行拆分。如果你看起来有点不同,那就是mergesort quicksort在相反的方向

归并:

分裂 - >递归 - >合并

快速排序:

umnerge(合并的对面) - >递归 - >加入(分裂的对面)

答案 3 :(得分:-1)

@templatetypedef在热门帖子中描述的mergesort算法在O(n lg n)中不起作用。由于链表不是随机访问,因此步骤2.1 Split the list into two lists of roughly equal size实际上意味着对列表进行排序的整体算法O(n ^ 2 log n)。试想一下。

这是一个使用mergesort对链表进行排序的链接,首先将元素读入数组 - http://www.geekviewpoint.com/java/singly_linked_list/sort

答案 4 :(得分:-7)

链接列表没有有效的排序算法。 制作数组,排序和重新链接。