Merge
算法的运行时间是否为O( n log k )?
algorithm MakingAHalf(List_Of_Lists)
if List_Of_Lists.size() = 1
return the only list in List_Of_Lists
else
split List_Of_Lists into two halfs (First_Half and Second_Half)
MakingAHalf(First_Half)
MakingAHalf(Second_Half)
Merge(First_Half, Second_Half, Min_Heap)
algorithm Merge(First_Half, Second_Half, Min_Heap) //T(n) = O(n log k)?
while First_Half is not empty and First_Second is not empty do
if First_Half.first().element() < Second_Half.first().element() then
Insert(Min_Heap, First_Half.remove(First_Half.first()))
else
Insert(Min_Heap, Second_Half.remove(Second_Half.first())
while First_Half is not empty do
Insert(Min_Heap, First_Half.remove(First_Half.first())
while Second_Half is not empty do
Insert(Min_Heap, Second_Half.remove(Second_Half.first())
algorithm Insert(A, key)
A[n+1] <-- key
while (i > 1) and (A[i] > A[[i/2]]) do
swap A[i] and A[[i/2]]
i <-- i - 1
答案 0 :(得分:1)
看看你的代码,你似乎对minHeaps是什么感到非常困惑。你所拥有的代码是非常错误的,并且谈论将合并排序边界变为毫无意义的时间复杂性。
你的Merge方法没有做任何事情来合并两个列表,所有它正在做的是将元素插入到MinHeap中,并且也按排序顺序插入!这看起来完全没有意义。
如果你使用MinHeap作为一个可以访问所有调用的堆并稍后从中读取它,那么它是O(n logn),因为你将n个项插入堆中并且你并不真正需要所有这些递归调用,只需逐个插入它们!
由于这看起来像是作业,我只会给你一个提示:在任何时候,堆中的元素不应超过k个。
答案 1 :(得分:0)
合并为O(log N)
,MergeSort为O(NlogN)
。 HeapSort是另一种算法。