Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. class BinHeap:
  2. def __init__(self):
  3. self.heaplist = []
  4. self.heapsize = 0
  5.  
  6. def left(self, i):
  7. return i * 2 + 1
  8.  
  9. def right(self, i):
  10. return i * 2 + 2
  11.  
  12. def heapify(self, i):
  13. l = self.left(i)
  14. r = self.right(i)
  15. # Знаки
  16. if l <= self.heapsize and self.heaplist[l] > self.heaplist[i]:
  17. largest = l
  18. else:
  19. largest = i
  20. # Знаки и последний индекс
  21. if r <= self.heapsize and self.heaplist[r] > self.heaplist[largest]:
  22. largest = r
  23. if largest != i:
  24. # Обмен значениями явный
  25. tmp = self.heaplist[i]
  26. self.heaplist[i] = self.heaplist[largest]
  27. self.heaplist[largest] = tmp
  28. self.heapify(largest)
  29.  
  30. def buildHeap(self, list):
  31. self.heaplist = list
  32. # Из-за того, что у вас в процедуре используется <=, heapsize должен быть строго меньше, чтобы избежать выхода за пределы
  33. self.heapsize = len(list) - 1
  34. # Индексы также c середины и до нуля включительно
  35. for i in range(len(list) // 2, -1, -1):
  36. print(i)
  37. self.heapify(i)
  38.  
  39. def heapSort(self):
  40. pass
  41.  
  42. def extractMax(self):
  43. pass
  44.  
  45. def getHeap(self):
  46. return self.heaplist
  47.  
  48. def add(self, elem):
  49. self.heaplist[-1]= elem
  50. self.heapsize += 1
  51. i = len(self.heaplist) - 1
  52. while i > 1 and self.heaplist[i // 2] < elem:
  53. self.heaplist[i] = self.heaplist[i // 2]
  54. i //= 2
  55. self.heaplist[i] = elem
  56. def pop(self):
  57. if self.heapsize == 2:
  58. return self.pop()
  59. retval = self.heaplist[1]
  60. self.heaplist[1] = self.pop
  61. i = 1
  62. while 2 * i + 1 < self.heapsize \
  63. and self.heaplist[i] < max(self.heaplist[2 * i], self.heaplist[2 * i + 1]):
  64.  
  65. if self.heaplist[2 * i] > self.heaplist[2 * i + 1]:
  66. self.heaplist[i], self.heaplist[2 * i] = self.heaplist[2 * i], self.heaplist[i]
  67. i = 2 * i
  68. else:
  69. self.heaplist[i], self.heaplist[2 * i + 1] = self.heaplist[2 * i + 1], self.heaplist[i]
  70. i = 2 * i + 1
  71. if 2 * i == self.heapsize - 1 and self.heaplist[i] < self.heaplist[2 * i]:
  72. self.heaplist[i], self.heaplist[2 * i] = self.heaplist[2 * i], self.heaplist[i]
  73. self.heapsize -= 1
  74. return retval
  75.  
  76.  
  77.  
  78. def print_heap(ar):
  79. ml = max(len(str(x)) for x in ar)
  80. ars = [('{:0'+str(ml)+'}').format(x) for x in ar]
  81. dp = len(bin(len(ar))) - 1
  82. print('*' * 2**(dp-2) * (ml + 1))
  83. for i in range(1, dp + 1):
  84. str_space = ' ' * max(0, 2**(dp-i-2) * (ml + 1) - 1 - ml // 2)
  85. sep_space = ' ' * max(0, 2**(dp-i-1) * (ml + 1) - ml)
  86. print(str_space + sep_space.join(ars[2**(i-1) - 1: 2**i - 1]))
  87. print('*' * 2**(dp-2) * (ml + 1))
  88.  
  89. # def pop(Heap):
  90. # retval = Heap[-1]
  91. # Heap[-1] = Heap.pop()
  92. # i = 1
  93. # while 2 * i + 1 < len(Heap) \
  94. # and Heap[i] < max(Heap[2 * i], Heap[2 * i + 1]):
  95. # if Heap[2 * i] > Heap[2 * i + 1]:
  96. # Heap[i], Heap[2 * i] = Heap[2 * i], Heap[i]
  97. # i = 2 * i
  98. # else:
  99. # Heap[i], Heap[2 * i + 1] = Heap[2 * i + 1], Heap[i]
  100. # i = 2 * i + 1
  101. # if 2 * i == len(Heap) - 1 and Heap[i] < Heap[2 * i]:
  102. # Heap[i], Heap[2 * i] = Heap[2 * i], Heap[i]
  103. # return retval
  104.  
  105. heap = BinHeap()
  106. heap.buildHeap([ 9, 5, 6,2, 2, 1, 4, 12, 3, 30])
  107. # heap.add(8)
  108. # heap.add(150)
  109. # heap.add(16)
  110. # heap.add(72)
  111. # heap.add(73)
  112. # heap.add(74)
  113. # heap.add(75)
  114. # pop(heap.getHeap())
  115. heap.pop()
  116. print_heap(heap.getHeap())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement