【问题标题】:What is the best way to sort link list? [closed]对链表进行排序的最佳方法是什么? [关闭]
【发布时间】:2010-12-16 13:12:36
【问题描述】:

[在 C/C++ 中] 对链接列表进行排序的最佳算法是什么?

【问题讨论】:

  • 您可能必须指定您想要的语言(C 或 C++),因为解决方案会完全不同。
  • 也许约翰可以帮助你:stackoverflow.com/questions/1733420/…
  • 没有“最佳”算法。这取决于您的具体情况。如果你能描述你的环境、你的列表实现和它将包含的数据,你可能会得到一个有效的答案。

标签: c algorithm list sorting


【解决方案1】:

值得思考你是如何走到这一步的。如果您需要以一种特定方式对项目进行排序,请考虑保持列表排序并将它们直接插入到排序列表中。这样您就不必在需要时对其进行排序。

【讨论】:

    【解决方案2】:

    基于堆栈的合并排序实现是首选武器。

    前段时间,我需要对一个双向链表进行排序。 Wikipedia 告诉我使用归并排序,因为它是三种常见的通用排序算法(堆排序、归并排序和快速排序)中唯一的一种,当随机访问速度较慢时表现良好,甚至提供了指向 Simon Tatham's implementation 的链接。

    首先,我re-implemented他的算法,这表明它基本上是众所周知的迭代版本。这是一个糟糕的选择,因为它依赖于随机访问,因此性能很差。

    recursive version 更适合链表,因为它只在拆分时不必要地遍历其中一个列表,而不是同时遍历两者(Simon 的变体也是如此)。

    您应该使用stack-based version,因为此实现完全消除了不必要的列表遍历。

    【讨论】:

      【解决方案3】:

      取决于您所说的“最佳”是什么意思。你的意思是最快的实现,还是最有效的运行时?您要分类的内容的大小和特征也很重要。排序 10 个项目与排序 1000 万个项目可能会导致不同的“最佳”算法。对于“最佳”意味着最快运行时间的大型数据集,我喜欢快速排序。

      【讨论】:

      • 我想我记得听说过快速排序在排序(或接近排序)的数据上运行缓慢。因此,正如 bpv 所说,数据的特征确实会在您的决策中发挥重要作用。
      • @veol:天真的快速排序运行缓慢,大多数实际实现使用随机旋转。
      • @MAK: 上课好像又没专心了:)
      【解决方案4】:

      归并排序适用于对链表进行排序。一些细节here。示例 C 代码here

      为什么适合?好吧,简单地说,mergesort 的主要组件——排序子序列的合并——可以很容易地在两个链表上完成,因为它所需要的只是比较头元素,所以它不需要数组的随机访问。

      另外,这里有一篇名为 A COMPARATIVE STUDY OF LINKED LIST SORTING ALGORITHMS 的文章,您可能会觉得有趣。

      【讨论】:

      • 我不知道为什么人们一直链接到这个网站 - 实现很糟糕,因为它过于复杂并且不必要地遍历列表;使用的算法等效于基于迭代数组的版本——它不适合链表,因为它们不允许随机访问——应该用基于堆栈的实现来代替;即使是香草递归的也应该表现得更好
      【解决方案5】:

      Merge sort.

      更好的是,只需使用std::list 及其sort() 方法。

      【讨论】:

      • 您想详细说明合并排序的原因吗?感谢您推荐 STL,但因为是家庭作业而无法使用它
      • @Cory:在三种常用算法(堆排序、快速排序、合并排序)中,它是唯一一种在没有随机访问的情况下表现良好的算法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2014-05-27
      • 2018-11-20
      相关资源
      最近更新 更多