Java PriorityQueue vs Collections.sort

Java PriorityQueue vs Collections.sort,java,collections,priority-queue,Java,Collections,Priority Queue,当我知道PQ的时间复杂度更好时,我什么时候会选择Collections.sort()而不是PriorityQueue 轮询PriorityQueue的所有元素实际上是堆排序Collections.sort()是使用合并排序实现的。堆排序和合并排序在时间复杂度方面具有可比性。两者都具有最佳情况、最坏情况和平均情况O(n logn)时间复杂度 就性能而言,这是必须说明的: Heapsort还与merge-sort竞争,后者具有相同的时间界限。合并排序需要Ω(n)辅助空间,但heapsort只需要常量

当我知道PQ的时间复杂度更好时,我什么时候会选择
Collections.sort()
而不是
PriorityQueue

轮询
PriorityQueue
的所有元素实际上是
堆排序
Collections.sort()
是使用
合并排序
实现的。堆排序和合并排序在时间复杂度方面具有可比性。两者都具有最佳情况、最坏情况和平均情况O(n logn)时间复杂度

就性能而言,这是必须说明的:

Heapsort还与merge-sort竞争,后者具有相同的时间界限。合并排序需要Ω(n)辅助空间,但heapsort只需要常量。实际上,Heapsort通常在数据缓存较小或较慢的机器上运行得更快。另一方面,合并排序比堆排序有几个优点:

  • 阵列上的合并排序具有相当好的数据缓存性能,通常优于现代桌面计算机上的heapsort,因为合并排序经常访问连续的内存位置(良好的引用位置);heapsort引用分布在整个堆中
  • Heapsort不是一个稳定的类别;合并排序是稳定的
  • Merge-sort具有良好的并行性,可以通过简单的实现实现接近线性的加速;heapsort显然不是并行算法的候选者
  • 合并排序可以调整为对具有O(1)额外空间的单链表进行操作。Heapsort可以调整为在双链表上操作,只需额外增加O(1)个空间开销。[需要引用]
  • 合并排序用于外部排序;希普索尔不是。引用的位置是个问题

PriorityQueue
不是用于排序,而是用于在不断变化的队列中获取最高优先级的元素。使用
PriorityQueue
进行排序既不会提高性能,也不会使代码可读。因此,我建议您在排序时坚持使用
Collections.sort()

使用
Collections.sort()
的一个明显原因是如果您已经有了要排序的
列表。它可以直接对该表示进行操作(类似地,
array.sort
和数组)。使用
PriorityQueue
需要复制所有引用并计算堆,然后才能开始轮询。这意味着将引用复制到另一个
列表
数据结构中。

堆与快速排序(或
sort()
使用的任何方法)。每当您有一个列表并希望对其进行排序时。PriorityQueue甚至不按比较器的顺序迭代元素。它不允许通过索引等方式访问元素。