我知道如何使用归并排序对链表进行排序。但问题是,为什么我们不使用堆来创建已排序的LinkedList呢?
1.遍历链表,并将项目添加到最小堆中。 2.从堆中取出项目,重新构建堆并添加到新的结果LinkedList中。
第一步需要O(n)的时间用于遍历列表和O(nlogn)的时间将项目添加到堆中。总共需要O(nlogn)的时间[如果我错了,请纠正我]。
从堆中获取一个项目的时间复杂度为O(1),将项目作为下一个节点添加到LinkedList中的时间复杂度为O(1)。[如果我错了,请纠正我]
因此,如果我理解正确,这种排序可以在O(nlogn)的时间内完成。这与归并排序相同。就内存而言,我们使用了一个额外的堆,所以总内存可以是O(nlogn)。归并排序也可能需要O(nlogn),但可以改进为O(logn)。
堆逻辑与“合并k个已排序链表”的逻辑相同。我假设每个链接列表都只有1项。
关于堆版本的时间复杂度,我的复杂度分析可能完全错误。如果有人知道为什么不能使用堆(为什么归并排序更好),请解释一下。这不是堆排序,也不是原地算法。如果时间复杂度是O(n²logn),我不确定为什么。
1.遍历链表,并将项目添加到最小堆中。 2.从堆中取出项目,重新构建堆并添加到新的结果LinkedList中。
第一步需要O(n)的时间用于遍历列表和O(nlogn)的时间将项目添加到堆中。总共需要O(nlogn)的时间[如果我错了,请纠正我]。
从堆中获取一个项目的时间复杂度为O(1),将项目作为下一个节点添加到LinkedList中的时间复杂度为O(1)。[如果我错了,请纠正我]
因此,如果我理解正确,这种排序可以在O(nlogn)的时间内完成。这与归并排序相同。就内存而言,我们使用了一个额外的堆,所以总内存可以是O(nlogn)。归并排序也可能需要O(nlogn),但可以改进为O(logn)。
堆逻辑与“合并k个已排序链表”的逻辑相同。我假设每个链接列表都只有1项。
关于堆版本的时间复杂度,我的复杂度分析可能完全错误。如果有人知道为什么不能使用堆(为什么归并排序更好),请解释一下。这不是堆排序,也不是原地算法。如果时间复杂度是O(n²logn),我不确定为什么。