diff --git a/heap_sort.rb b/heap_sort.rb new file mode 100644 index 0000000..f18c3a8 --- /dev/null +++ b/heap_sort.rb @@ -0,0 +1,34 @@ +""" +Algorithm: Heap-Sort +Time-Complexity: O(nlogn) +""" +def heap_sort(array) + array_size = array.size + adjusted_array = [nil] + array + (array_size / 2).downto(1) do |i| + adjusted_down(adjusted_array, i, array_size) + end + while array_size > 1 + adjusted_array[1], adjusted_array[array_size] = adjusted_array[array_size], adjusted_array[1] + array_size -= 1 + adjusted_down(adjusted_array, 1, array_size) + end + adjusted_array.drop(1) + end + +#Method to adjust heap in downward manner +def adjusted_down(adjusted_array, parent, limit) + top = adjusted_array[parent] + while (child = 2 * parent) <= limit + child += 1 if child < limit and adjusted_array[child] < adjusted_array[child + 1] + break if top >= adjusted_array[child] + adjusted_array[parent] = adjusted_array[child] + parent = child + end + adjusted_array[parent] = top +end + + +#Code for testing heapsort +array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].shuffle +print heap_sort(array) \ No newline at end of file