Created
January 9, 2020 14:29
-
-
Save dtaivpp/4400c2cc914e2d4d1982fb23baa1af8a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Courtesy of https://stackabuse.com/sorting-algorithms-in-python/ | |
def heapify(nums, heap_size, root_index): | |
# Assume the index of the largest element is the root index | |
largest = root_index | |
left_child = (2 * root_index) + 1 | |
right_child = (2 * root_index) + 2 | |
# If the left child of the root is a valid index, and the element is greater | |
# than the current largest element, then update the largest element | |
if left_child < heap_size and nums[left_child] > nums[largest]: | |
largest = left_child | |
# Do the same for the right child of the root | |
if right_child < heap_size and nums[right_child] > nums[largest]: | |
largest = right_child | |
# If the largest element is no longer the root element, swap them | |
if largest != root_index: | |
nums[root_index], nums[largest] = nums[largest], nums[root_index] | |
# Heapify the new root element to ensure it's the largest | |
heapify(nums, heap_size, largest) | |
def heap_sort(nums): | |
n = len(nums) | |
# Create a Max Heap from the list | |
# The 2nd argument of range means we stop at the element before -1 i.e. | |
# the first element of the list. | |
# The 3rd argument of range means we iterate backwards, reducing the count | |
# of i by 1 | |
for i in range(n, -1, -1): | |
heapify(nums, n, i) | |
# Move the root of the max heap to the end of | |
for i in range(n - 1, 0, -1): | |
nums[i], nums[0] = nums[0], nums[i] | |
heapify(nums, i, 0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment