From cb30465d66da16c1d5bfe3e3a430a67e931fc8f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kilian=20Rue=C3=9F?= Date: Fri, 13 Oct 2017 18:37:27 +0200 Subject: [PATCH] Added Heapsort implementation --- SortingAlgorithms/heap_sort.py | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 SortingAlgorithms/heap_sort.py diff --git a/SortingAlgorithms/heap_sort.py b/SortingAlgorithms/heap_sort.py new file mode 100644 index 0000000..5d56881 --- /dev/null +++ b/SortingAlgorithms/heap_sort.py @@ -0,0 +1,37 @@ +class Heap: + def __init__(self, right, numbers): + self.right = right + self.numbers = numbers + self.build_heap() + + def build_heap(self): + for i in range(self.right // 2 - 1, -1, -1): + self.heapify(i, self.right) + + def heapify(self, start, heap_size): + while True: + left = 2 * start + 1 + right = 2 * start + 2 + max = start + if left < heap_size and self.numbers[left] > self.numbers[max]: + max = left + if right < heap_size and self.numbers[right] > self.numbers[max]: + max = right + if max == start: + return + self._swap(max, start) + start = max + + def remove_max(self): + self.right -= 1 + self._swap(0, self.right) + self.heapify(0, self.right) + + def _swap(self, i, j): + self.numbers[i], self.numbers[j] = self.numbers[j], self.numbers[i] + + +def heap_sort(values): + heap = Heap(len(values), values) + for i in range(len(values) - 1, 0, -1): + heap.remove_max()