Python HeapSort时间复杂度

时间:2017-03-27 03:10:26

标签: python heap heapsort

我已经为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)中运行?

1 个答案:

答案 0 :(得分:4)

是的,我相信你是对的。为了加快速度,请更换以下内容:

self.a = self.a[:-1]

使用:

self.a.pop()

列表的pop()成员函数删除并返回列表中的最后一个元素,具有恒定的时间复杂度。

list被存储为连续内存,这意味着list的所有元素一个接一个地存储。这就是为什么在list中间插入一个元素是如此昂贵的原因:Python必须在你插入的位置之后将所有元素向下移动一个,以便为新元素腾出空间。但是,简单地删除list末尾的元素所花费的时间可以忽略不计,因为Python只需删除该元素。