Skip to content

Commit 18358cf

Browse files
committed
Added binary heap and heap sort
1 parent 26c550b commit 18358cf

File tree

2 files changed

+134
-0
lines changed

2 files changed

+134
-0
lines changed

Searching-and-sorting/heap-sort.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
2+
# MIN HEAP IMPLEMENTATION
3+
4+
class BinaryHeap(object):
5+
def __init__(self):
6+
self.heap = [0]
7+
self.size = 0
8+
9+
def insert(self, n):
10+
self.heap.append(n)
11+
self.size += 1
12+
self.percolateUp(self.size)
13+
14+
def deleteMin(self):
15+
self.heap[1] = self.heap[self.size]
16+
self.size -= 1
17+
self.heap.pop()
18+
self.percolateDown(1)
19+
20+
def percolateUp(self, i):
21+
while i // 2 > 0:
22+
if self.heap[i] < self.heap[i // 2]:
23+
t = self.heap[i]
24+
self.heap[i] = self.heap[i // 2]
25+
self.heap[i // 2] = t
26+
i = i // 2
27+
28+
def percolateDown(self, i):
29+
while i * 2 <= self.size:
30+
minChild = self.findMinChild(i)
31+
if self.heap[i] > self.heap[minChild]:
32+
t = self.heap[i]
33+
self.heap[i] = self.heap[minChild]
34+
self.heap[minChild] = t
35+
i = i * 2
36+
37+
def findMinChild(self, i):
38+
if i * 2 + 1 > self.size:
39+
return i * 2
40+
if self.heap[i * 2] < self.heap[i * 2 + 1]:
41+
return i * 2
42+
return i * 2 + 1
43+
44+
def buildHeap(self, l):
45+
i = len(l) // 2
46+
self.heap = [0] + l[:]
47+
self.size = len(l)
48+
while i > 0:
49+
self.percolateDown(i)
50+
i -= 1
51+
#return self.heap
52+
53+
def heapSort(arr):
54+
b = BinaryHeap()
55+
b.buildHeap(arr)
56+
arr.clear()
57+
end = b.size
58+
while end > 0:
59+
arr.append(b.heap[1])
60+
b.deleteMin()
61+
end -= 1
62+
print(arr)
63+
64+
if __name__ == "__main__":
65+
arr = [3, 2, 5, 7, 0, 2, 9, 1, 7, 6, 4]
66+
print(arr)
67+
heapSort(arr)
68+

Trees/implementing-binary-heap.py

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
2+
# MIN HEAP IMPLEMENTATION
3+
4+
class BinaryHeap(object):
5+
def __init__(self):
6+
self.heap = [0]
7+
self.size = 0
8+
9+
def insert(self, n):
10+
self.heap.append(n)
11+
self.size += 1
12+
self.percolateUp(self.size)
13+
14+
def deleteMin(self):
15+
self.heap[1] = self.heap[self.size]
16+
self.size -= 1
17+
self.heap.pop()
18+
self.percolateDown(1)
19+
20+
def percolateUp(self, i):
21+
while i // 2 > 0:
22+
if self.heap[i] < self.heap[i // 2]:
23+
t = self.heap[i]
24+
self.heap[i] = self.heap[i // 2]
25+
self.heap[i // 2] = t
26+
i = i // 2
27+
28+
def percolateDown(self, i):
29+
while i * 2 <= self.size:
30+
minChild = self.findMinChild(i)
31+
if self.heap[i] > self.heap[minChild]:
32+
t = self.heap[i]
33+
self.heap[i] = self.heap[minChild]
34+
self.heap[minChild] = t
35+
i = i * 2
36+
37+
def findMinChild(self, i):
38+
if i * 2 + 1 > self.size:
39+
return i * 2
40+
if self.heap[i * 2] < self.heap[i * 2 + 1]:
41+
return i * 2
42+
return i * 2 + 1
43+
44+
def buildHeap(self, l):
45+
i = len(l) // 2
46+
self.heap = [0] + l[:]
47+
self.size = len(l)
48+
while i > 0:
49+
self.percolateDown(i)
50+
i -= 1
51+
52+
if __name__ == "__main__":
53+
b = BinaryHeap()
54+
b.insert(5)
55+
b.insert(4)
56+
b.insert(7)
57+
b.insert(1)
58+
b.insert(0)
59+
b.insert(9)
60+
b.insert(2)
61+
print("Heap", b.heap)
62+
b.deleteMin()
63+
print("After deleting", b.heap)
64+
b.buildHeap([5, 4, 7, 1, 0, 9, 2])
65+
print("Building heap from list:", b.heap)
66+

0 commit comments

Comments
 (0)