Я написал следующий код для 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)
из-за нарезки списка. (Для списка размера «n» его нарезка до «n-1» займет время O (n-1)). Может ли кто-нибудь подтвердить, правильно ли я думаю здесь? Если да, то какие должны быть минимальные изменения в функции heapSort
, чтобы она работала в O(nlogn)
?