由于某种原因,我的堆排序运行的速度比它应该的速度慢几个:
def heapsort(unsrt):
if len(unsrt) == 1:
return unsrt
elif len(unsrt) == 2:
if (unsrt[0] > unsrt[1]):
unsrt.append(unsrt.pop(0))
return unsrt
for i in range((len(unsrt)-2)/2,-1,-1):
root = i
# print unsrt
while True:
left = root * 2 + 1#left child
rght = left+1 #right child
if len(unsrt)-1 < rght: #if you've reached the end
break
if len(unsrt) >= rght and unsrt[left] < unsrt[rght]:
left += 1
rght += 1
if unsrt[root] < unsrt[left]:
unsrt[root], unsrt[left] = unsrt[left], unsrt[root]
root = left
else:
break
unsrt.append(unsrt.pop(0))
unsrt[:-1] = heapsort(unsrt[:-1])
return unsrt
我相信它在n ^ 2(log n)^ 2运行,但我不确定如何减少顺序。有没有办法让我把它变成正确的顺序? unsrt
是一个未排序的数组。
答案 0 :(得分:0)
我认为问题来自这条线:
unsrt.append(unsrt.pop(0))
unsrt[:-1] = heapsort(unsrt[:-1])
基本上,如果我理解你的实现,你会在每次调用时堆积数组,获得最大值,将它放在数组中的最后一个元素上,然后再次进行工作。
我可以在这里找出3个问题:
pop(0)
在 O(n)中运行,因为您称之为 n 次,这是您的 O(n²) unsrt[:-1]
创建了一份列表的副本,该列表也是 O(n),即使由于内存优化而非常快,但仍然是浪费时间所以这就是我要做的事情:
使用此解决方案,您将永远不必翻译数组中的元素。从堆中删除元素时,会自动将其推送到数组中的最后一个未排序位置。