Skip to content

Commit 5530f58

Browse files
committed
Added maxheap and minheap
1 parent e1f6132 commit 5530f58

File tree

11 files changed

+199
-0
lines changed

11 files changed

+199
-0
lines changed
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

heap_test.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import unittest
2+
from minheap import minheap
3+
from maxheap import maxheap
4+
import random
5+
6+
class test_heap(unittest.TestCase):
7+
8+
def setUp(self):
9+
self.h = minheap()
10+
self.m = maxheap()
11+
self.a = [random.choice(range(50)) for i in range(10)]
12+
self.h.build_heap(self.a)
13+
self.m.build_heap(self.a)
14+
15+
def test_heap_pop(self):
16+
self.assertEqual(min(self.a), self.h.heappop())
17+
self.assertEqual(max(self.a), self.m.heappop())
18+
19+
def test_max_elements(self):
20+
self.assertEqual(len(self.a), self.h.max_elements())
21+
self.assertEqual(len(self.a), self.m.max_elements())
22+
23+
def test_heap_sort(self):
24+
sorted_h = [self.h.heappop() for i in range(self.h.max_elements())]
25+
sorted_m = [self.m.heappop() for i in range(self.m.max_elements())]
26+
self.assertEqual(sorted_h, sorted(self.a))
27+
self.assertEqual(sorted_m, sorted(self.a, reverse=True))
28+
29+
def test_heap_push_method(self):
30+
self.h.heappush(-1)
31+
self.assertEqual(-1, self.h.heappop())
32+
self.m.heappush(100)
33+
self.assertEqual(100, self.m.heappop())
34+
35+
if __name__ == "__main__":
36+
unittest.main()

heaps/heap_test.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import unittest
2+
from minheap import minheap
3+
from maxheap import maxheap
4+
import random
5+
6+
class test_heap(unittest.TestCase):
7+
8+
def setUp(self):
9+
self.h = minheap()
10+
self.m = maxheap()
11+
self.a = [random.choice(range(50)) for i in range(10)]
12+
self.h.build_heap(self.a)
13+
self.m.build_heap(self.a)
14+
15+
def test_heap_pop(self):
16+
self.assertEqual(min(self.a), self.h.heappop())
17+
self.assertEqual(max(self.a), self.m.heappop())
18+
19+
def test_max_elements(self):
20+
self.assertEqual(len(self.a), self.h.max_elements())
21+
self.assertEqual(len(self.a), self.m.max_elements())
22+
23+
def test_heap_sort(self):
24+
sorted_h = [self.h.heappop() for i in range(self.h.max_elements())]
25+
sorted_m = [self.m.heappop() for i in range(self.m.max_elements())]
26+
self.assertEqual(sorted_h, sorted(self.a))
27+
self.assertEqual(sorted_m, sorted(self.a, reverse=True))
28+
29+
def test_heap_push_method(self):
30+
self.h.heappush(-1)
31+
self.assertEqual(-1, self.h.heappop())
32+
self.m.heappush(100)
33+
self.assertEqual(100, self.m.heappop())
34+
35+
if __name__ == "__main__":
36+
unittest.main()

heaps/heapsort.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from minheap import minheap
2+
import random
3+
4+
def heapsort(nums):
5+
h = minheap(nums)
6+
return [h.heappop() for i in range(h.max_elements())]
7+
8+
if __name__ == "__main__":
9+
a = [random.choice(range(100)) for i in range(40)]
10+
print heapsort(a) == sorted(a)

heaps/maxheap.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from minheap import minheap
2+
class maxheap(minheap):
3+
"""
4+
Heap class - made of keys and items
5+
methods: build_heap, heappush, heappop
6+
"""
7+
8+
MAX_HEAP = True
9+
10+
def __str__(self):
11+
return "Max-heap with %s items" % (len(self.heap))
12+
13+
def heapify(self, i):
14+
l = self.leftchild(i)
15+
r = self.rightchild(i)
16+
largest = i
17+
if l < self.max_elements() and self.heap[l] > self.heap[largest]:
18+
largest = l
19+
if r < self.max_elements() and self.heap[r] > self.heap[largest]:
20+
largest = r
21+
if largest != i:
22+
self.heap[i], self.heap[largest] = self.heap[largest], self.heap[i]
23+
self.heapify(largest)
24+
25+
def heappush(self, x):
26+
""" Adds a new item x in the heap"""
27+
i = len(self.heap)
28+
self.heap.append(x)
29+
parent = self.parent(i)
30+
while parent != [] and self.heap[i] > self.heap[parent]:
31+
self.heap[i], self.heap[parent] = self.heap[parent], self.heap[i]
32+
i = parent
33+
parent = self.parent(i)

0 commit comments

Comments
 (0)