我已经为HeapSort编写了以下代码,它运行正常:
class Heap(object):
def __init__(self, a):
self.a = a
def heapify(self, pos):
left = 2*pos + 1
right = 2*pos + 2
maximum = pos
if left < len(self.a) and self.a[left] > self.a[maximum]:
maximum = left
if right < len(self.a) and self.a[right] > self.a[maximum]:
maximum = right
if maximum != pos:
self.a[pos], self.a[maximum] = self.a[maximum], self.a[pos]
self.heapify(maximum)
def buildHeap(self):
for i in range(len(self.a)/2, -1, -1):
self.heapify(i)
def heapSort(self):
elements = len(self.a)
for i in range(elements):
print self.a[0]
self.a[0] = self.a[-1]
self.a = self.a[:-1]
self.heapify(0)
def printHeap(self):
print self.a
if __name__ == '__main__':
h = Heap(range(10))
h.buildHeap()
h.printHeap()
h.heapSort()
但是,由于列表切片,似乎此处的函数heapSort
需要时间O(n^2)
。 (对于大小&#39; n&#39;列表,将其切换为&#39; n-1&#39;将花费O(n-1)时间。
任何人都可以确认我的想法是否正确吗?
如果是,那么heapSort
函数中的最小变化应该是什么才能使其在O(nlogn)
中运行?
答案 0 :(得分:4)
是的,我相信你是对的。为了加快速度,请更换以下内容:
self.a = self.a[:-1]
使用:
self.a.pop()
列表的pop()
成员函数删除并返回列表中的最后一个元素,具有恒定的时间复杂度。
list
被存储为连续内存,这意味着list
的所有元素一个接一个地存储。这就是为什么在list
中间插入一个元素是如此昂贵的原因:Python必须在你插入的位置之后将所有元素向下移动一个,以便为新元素腾出空间。但是,简单地删除list
末尾的元素所花费的时间可以忽略不计,因为Python只需删除该元素。