From f093fb2f13bd64765fd0243a9c70c2baa9cda003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Wahr=C3=A9us?= Date: Fri, 22 May 2026 15:55:34 +0200 Subject: [PATCH] Added heap_sort.py --- README.md | 1 + algorithms/heap_sort.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 algorithms/heap_sort.py diff --git a/README.md b/README.md index 9b1fa86..297ff0b 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ A repo for storing Python code and tracking learning progress. All programs are │ ├── binary_search.py │ ├── bubble_sort.py │ ├── dfs.py +│ ├── heap_sort.py │ ├── merge_sort.py │ ├── quicksort.py │ └── selection_sort.py diff --git a/algorithms/heap_sort.py b/algorithms/heap_sort.py new file mode 100644 index 0000000..a17f86e --- /dev/null +++ b/algorithms/heap_sort.py @@ -0,0 +1,37 @@ +def heap_sort(numbers: list[int]) -> list[int]: + heap_size = len(numbers) + + for i in range(heap_size // 2 - 1, -1, -1): + heapify(numbers, heap_size, i) + + for i in range(heap_size - 1, 0, -1): + numbers[0], numbers[i] = numbers[i], numbers[0] + heapify(numbers, i, 0) + + return numbers + + +def heapify(numbers: list[int], heap_size: int, root_index: int) -> None: + largest_index = root_index + left_index = 2 * root_index + 1 + right_index = 2 * root_index + 2 + + if left_index < heap_size and numbers[left_index] > numbers[largest_index]: + largest_index = left_index + + if right_index < heap_size and numbers[right_index] > numbers[largest_index]: + largest_index = right_index + + if largest_index != root_index: + numbers[root_index], numbers[largest_index] = numbers[largest_index], numbers[root_index] + heapify(numbers, heap_size, largest_index) + + +def main() -> None: + numbers = [4, 2, 7, 1, 9, 6, 5, 8, 3] + print("Unsorted list:", numbers) + print("Sorted list: ", heap_sort(numbers)) + + +if __name__ == "__main__": + main() \ No newline at end of file