排序单链接与排序双链表

时间:2018-02-15 17:34:00

标签: java sorting

如果之前已经回答过,请指出我正确的方向!

所以,在阅读有关排序的过程中,我一直在SO周围闲逛。我想知道,为单链表和双链表选择一个好的排序算法(以及与数组结构相比的链接结构)之间的主要区别是什么?

我知道(假设我们使用的是OO语言)类型对要排序的元素很重要(原始类型通常比复杂对象更快)。我正在比较Java字符串和整数。

据我所知,在处理链接结构时,我们应该排除Quicksort和Insertion排序,因为它们处理索引很多。

这个问题可能很糟糕,但正如我所提到的,请指出另一个我可以阅读有关选择正确算法的来源(如何实现算法)。

2 个答案:

答案 0 :(得分:0)

我说没有区别。对于基于比较的一般排序算法,您受到O(n)读取和O(log(n))比较的限制。

以合并排序为例,切断列表,直到达到基本情况(已经排序了一个项目的列表)。然后,您正在合并和交换无序的项目。交换单个或双向链表是O(1)操作。

如果你知道你的数据会按照某种顺序进行,那么可能会有一个双重链接列表,部分排序"结构,例如。正在"更多排序"向前与向后,然后你可以编写你的列表行走以走向将产生更少交换的特定方向,但最终你仍然有一个O(n log n)算法,由于只做了非常非常快的运行时间O(log n)比较,减去掉期。

答案 1 :(得分:0)

是的,尝试远离链接结构索引的想法是一个很好的指导方针。但请注意,这不是一个严格的规则。

  

我知道(假设我们使用OO语言)类型对要排序的元素很重要等(原始类型通常比复杂对象更快)。我正在比较Java字符串和整数。

这是一个非常好的想法!原始类型具有快速比较时间,因此对于Quicksort这些工作得很好(假设它们不在链接结构中)。

如果长时间比较字符串可能会非常昂贵。因此,对许多字符串进行合并排序是一个好主意。所以这里的主要想法是如果我们进行昂贵的比较,首选Merge排序。如果我们有快速比较,Quicksort可能会更受欢迎(假设我们有一个很好的技术来选择Pivot value)。

对于链接结构,一个想法也可以是将所有列表复制到堆中,然后执行Heap Sort。但如果我们的记忆力有限,这不是解决问题的好方法。

如果您无法确定适用于您的代码的良好排序算法,请遵循语言标准。例如,请参阅此主题:Why Collections.sort uses merge sort instead of quicksort? [closed]

一个小清单:

  • 如果你不能使用更多的内存:Quicksort。
  • 如果您负担不起慢速比较:合并排序。
  • 如果你有一个非常(非常)大的结构:Quicksort或Merge sort。
  • 如果您有链接结构:合并排序。

当然,有许多场景组合需要仔细选择。还有更多的排序算法可供使用。我只提到了Merge和Quick,因为你似乎很了解它们。

相关问题