【问题标题】:Sorting a LinkedList in ascending order [closed]按升序对LinkedList进行排序[关闭]
【发布时间】:2017-11-19 00:54:35
【问题描述】:

对链表进行排序最简单的方法是什么?我有一个节点列表,每个节点都有 2 个属性,一个 int 和一个 string。我应该如何按整数升序对列表进行排序?

【问题讨论】:

  • 您可以拨打Collections#sort。但请注意,使用LinkedList 时运行时将非常不理想。考虑将所有内容添加到更好的数据结构中,然后对其进行排序。之后从它创建一个链表。或者,只需将所有元素添加到 PriorityQueue,然后将 pull 中的所有元素(它自动排序),将它们添加到新的 LinkedList。
  • 请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作摘要,以及对您在解决它时遇到的困难(help center,How to Ask)。
  • 如果您自己实现了列表,最简单的方法是 1) 将节点放入数组中,2) 使用 Arrays::sort 对节点进行排序,3) 从排序后的节点重建列表。
  • 链表的随机访问性能较慢。出于这个原因,合并排序优于其他O(n log n) 排序算法。
  • @Zabuza - collections#sort 如何为链表实现?使用具有小(26 到 32)个节点引用数组的自下而上合并排序相当快。对于链表来说,自上而下的合并排序稍微慢一些,它重复扫描子列表以拆分它们。自下而上的归并排序都是顺序访问。

标签: java sorting linked-list nodes


【解决方案1】:

排序

您可以致电Collection#sort (documentation)。但请注意,由于LinkedList 未提供RandomAccess,运行时将非常不理想。

最好将所有内容添加到更合适的数据结构中,例如ArrayList,对其进行排序,然后重建LinkedList:

LinkedList<X> input = ...

ArrayList<X> list = new ArrayList<>(input);
Collections.sort(list);

input = new LinkedList<>(list);

或者,您可以将所有内容添加到 PriorityQueue (documentation) 中,它提供排序的 poll 操作:

LinkedList<X> input = ...

PriorityQueue<X> queue = new PriorityQueue(input);
input = new LinkedList<>();
while (!queue.isEmpty()) {
    input.add(queue.poll());
}

如果你的LinkedList 没有扩展Collection,你就不能调用像new ArrayList&lt;&gt;(input) 这样方便的构造函数。在这种情况下,您需要手动将所有元素添加到另一个列表中。


比较器

如果你想排序,你需要定义一些order。您有多种选择。

您可以使您的Node 对象实现Comparable (documentation)。然后你需要定义一个compareTo 方法来定义两个对象之间的关系。然后提供的方法将使用此自然顺序。

或者,您可以创建一个Comparator (documentation),它还定义了一个compare 方法。提供的方法都将Comparator 作为可选参数,例如:

Collections.sort(list, comp);
// or
PriorityQueue<X> queue = new PriorityQueue(input, comp);

然后该方法可能如下所示:

@Override
public int compare(Node first, Node second) {
    return Integers.compare(first.getIntProperty(), second.getIntProperty());
}

使用 Java 8 你可以创建这样一个非常紧凑的Comparator:

Comparator<Node> comp = Comparator.comparing(Node::getIntProperty);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 2021-04-11
    • 2013-05-30
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多