def heapify(a, idx, size) |
left_idx = 2 * idx + 1 |
right_idx = 2 * idx + 2 |
bigger_idx = idx |
bigger_idx = left_idx if left_idx < size && a[left_idx] > a[idx] |
bigger_idx = right_idx if right_idx < size && a[right_idx] > a[bigger_idx] |
if bigger_idx != idx |
a[idx], a[bigger_idx] = a[bigger_idx], a[idx] |
heapify(a, bigger_idx, size) |
end |
end |
def build_heap(a) |
last_parent_idx = a.length / 2 - 1 |
i = last_parent_idx |
while i >= 0 |
heapify(a, i, a.size) |
i = i - 1 |
end |
end |
def heap_sort(a) |
return a if a.size <= 1 |
size = a.size |
build_heap(a) |
while size > 0 |
a[ 0 ], a[size- 1 ] = a[size- 1 ], a[ 0 ] |
size = size - 1 |
heapify(a, 0 , size) |
end |
return a |
end |