Heap Sort
Heap sort uses property of heap to sort the array. It involves building a max heap for increasing order sorting which contains largest element of the heap at the root. For decreasing order sorting min heap is used which contains smallest element of the heap at the root. The process step of for increasing order sorting of heap sort is summarized below:
- Step 1: Build a max heap which contains largest element of the heap at the root
- Step 2: Swap the last element of heap with root element and remove the last element from the heap. With the remaining elements repeat the step 1.
Example:
To understand the heap sort, lets consider an unsorted array [10, 1, 23, 50, 7, -4] and discuss each step taken to sort the array in ascending order.
In the below figure, the heap structure of input array and max heap is shown. The index number of the root element of the heap is 0. In max heap, the largest element of the heap always resides at the root.
After building the initial max heap, the last element of heap is swapped with the root element and the last element which contains the largest number of the array is removed from the heap. After that, the heapify function is used on the remaining elements of the heap to make it as a max heap and the number of elements will reduce by one. This process is continued until the number of elements in the heap is one. At this point, the array will be sorted.
The above figure describes elimination of largest element from the heap and formation of the max heap from the remaining elements of the heap. The final outcome of the process is an increasing order sorted array.
Implementation of Heap Sort
# function for heap sort which calls heapify function # to build the max heap and then swap last element of # the max-heap with the first element # exclude the last element from the heap and rebuild the heap def heapsort(MyList): n = len(MyList) for i in range(n//2, -1, -1): heapify(MyList, n-1, i) for i in range(n-1, -1, -1): # swap last element of the max-heap with the first element MyList[i], MyList[0] = MyList[0], MyList[i] # exclude the last element from the heap and rebuild the heap heapify(MyList, i-1, 0) # heapify function is used to build the max heap # max heap has maximum element at the root which means # first element of the array will be maximum in max heap def heapify(MyList, n, i): max, left, right = i, 2*i + 1, 2*i + 2 # if the left element is greater than root if left <= n and MyList[left] > MyList[max]: max = left # if the right element is greater than root if right <= n and MyList[right] > MyList[max]: max = right # if the max is not i if max != i: MyList[i], MyList[max] = MyList[max], MyList[i] # Recursively heapify the affected sub-tree heapify(MyList, n, max) # function to print list def PrintList(MyList): for i in MyList: print(i, end=" ") print("\n") # test the code MyList = [10, 1, 23, 50, 7, -4] n = len(MyList) print("Original List") PrintList(MyList) heapsort(MyList) print("Sorted List") PrintList(MyList)
The above code will give the following output:
Original List 10 1 23 50 7 -4 Sorted List -4 1 7 10 23 50
public class MyClass { // function for heap sort which calls heapify function // to build the max heap and then swap last element of // the max-heap with the first element // exclude the last element from the heap and rebuild the heap static void heapsort(int Array[]) { int n = Array.length; int temp; for(int i = n/2; i >= 0; i--) { heapify(Array, n-1, i); } for(int i = n - 1; i >= 0; i--) { //swap last element of the max-heap with the first element temp = Array[i]; Array[i] = Array[0]; Array[0] = temp; //exclude the last element from the heap and rebuild the heap heapify(Array, i-1, 0); } } // heapify function is used to build the max heap // max heap has maximum element at the root which means // first element of the array will be maximum in max heap static void heapify(int Array[], int n, int i) { int max = i; int left = 2*i + 1; int right = 2*i + 2; //if the left element is greater than root if(left <= n && Array[left] > Array[max]) { max = left; } //if the right element is greater than root if(right <= n && Array[right] > Array[max]) { max = right; } //if the max is not i if(max != i) { int temp = Array[i]; Array[i] = Array[max]; Array[max] = temp; //Recursively heapify the affected sub-tree heapify(Array, n, max); } } // function to print array static void PrintArray(int Array[]) { int n = Array.length; for (int i=0; i<n; i++) System.out.print(Array[i] + " "); System.out.println(); } // test the code public static void main(String[] args) { int[] MyArray = {10, 1, 23, 50, 7, -4}; int n = MyArray.length; System.out.println("Original Array"); PrintArray(MyArray); heapsort(MyArray); System.out.println("\nSorted Array"); PrintArray(MyArray); } }
The above code will give the following output:
Original Array 10 1 23 50 7 -4 Sorted Array -4 1 7 10 23 50
#include <iostream> using namespace std; static void heapsort(int Array[], int n); static void heapify(int Array[], int n, int i); static void PrintArray(int Array[], int n); // function for heap sort which calls heapify function // to build the max heap and then swap last element of // the max-heap with the first element // exclude the last element from the heap and rebuild the heap static void heapsort(int Array[], int n) { int temp; for(int i = n/2; i >= 0; i--) { heapify(Array, n-1, i); } for(int i = n - 1; i >= 0; i--) { //swap last element of the max-heap with the first element temp = Array[i]; Array[i] = Array[0]; Array[0] = temp; //exclude the last element from the heap and rebuild the heap heapify(Array, i-1, 0); } } // heapify function is used to build the max heap // max heap has maximum element at the root which means // first element of the array will be maximum in max heap static void heapify(int Array[], int n, int i) { int max = i; int left = 2*i + 1; int right = 2*i + 2; //if the left element is greater than root if(left <= n && Array[left] > Array[max]) { max = left; } //if the right element is greater than root if(right <= n && Array[right] > Array[max]) { max = right; } //if the max is not i if(max != i) { int temp = Array[i]; Array[i] = Array[max]; Array[max] = temp; //Recursively heapify the affected sub-tree heapify(Array, n, max); } } //function to print array static void PrintArray(int Array[], int n) { for (int i=0; i<n; i++) cout<<Array[i]<<" "; cout<<"\n"; } //test the code int main (){ int MyArray[] = {10, 1, 23, 50, 7, -4}; int n = sizeof(MyArray) / sizeof(MyArray[0]); cout<<"Original Array\n"; PrintArray(MyArray, n); heapsort(MyArray, n); cout<<"\nSorted Array\n"; PrintArray(MyArray, n); return 0; }
The above code will give the following output:
Original Array 10 1 23 50 7 -4 Sorted Array -4 1 7 10 23 50
#include <stdio.h> static void heapsort(int Array[], int n); static void heapify(int Array[], int n, int i); static void PrintArray(int Array[], int n); // function for heap sort which calls heapify function // to build the max heap and then swap last element of // the max-heap with the first element // exclude the last element from the heap and rebuild the heap static void heapsort(int Array[], int n) { int temp; for(int i = n/2; i >= 0; i--) { heapify(Array, n-1, i); } for(int i = n - 1; i >= 0; i--) { //swap last element of the max-heap with the first element temp = Array[i]; Array[i] = Array[0]; Array[0] = temp; //exclude the last element from the heap and rebuild the heap heapify(Array, i-1, 0); } } // heapify function is used to build the max heap // max heap has maximum element at the root which means // first element of the array will be maximum in max heap static void heapify(int Array[], int n, int i) { int max = i; int left = 2*i + 1; int right = 2*i + 2; //if the left element is greater than root if(left <= n && Array[left] > Array[max]) { max = left; } //if the right element is greater than root if(right <= n && Array[right] > Array[max]) { max = right; } //if the max is not i if(max != i) { int temp = Array[i]; Array[i] = Array[max]; Array[max] = temp; //Recursively heapify the affected sub-tree heapify(Array, n, max); } } // function to print array static void PrintArray(int Array[], int n) { for (int i=0; i<n; i++) printf("%i ",Array[i]); printf("\n"); } // test the code int main () { int MyArray[] = {10, 1, 23, 50, 7, -4}; int n = sizeof(MyArray) / sizeof(MyArray[0]); printf("Original Array\n"); PrintArray(MyArray, n); heapsort(MyArray, n); printf("\nSorted Array\n"); PrintArray(MyArray, n); return 0; }
The above code will give the following output:
Original Array 10 1 23 50 7 -4 Sorted Array -4 1 7 10 23 50
using System; class MyProgram { // function for heap sort which calls heapify function // to build the max heap and then swap last element of // the max-heap with the first element // exclude the last element from the heap and rebuild the heap static void heapsort(int[] Array) { int n = Array.Length; int temp; for(int i = n/2; i >= 0; i--) { heapify(Array, n-1, i); } for(int i = n - 1; i >= 0; i--) { //swap last element of the max-heap with the first element temp = Array[i]; Array[i] = Array[0]; Array[0] = temp; //exclude the last element from the heap and rebuild the heap heapify(Array, i-1, 0); } } // heapify function is used to build the max heap // max heap has maximum element at the root which means // first element of the array will be maximum in max heap static void heapify(int[] Array, int n, int i) { int max = i; int left = 2*i + 1; int right = 2*i + 2; //if the left element is greater than root if(left <= n && Array[left] > Array[max]) { max = left; } //if the right element is greater than root if(right <= n && Array[right] > Array[max]) { max = right; } //if the max is not i if(max != i) { int temp = Array[i]; Array[i] = Array[max]; Array[max] = temp; //Recursively heapify the affected sub-tree heapify(Array, n, max); } } // function to print array static void PrintArray(int[] Array) { int n = Array.Length; for (int i=0; i<n; i++) Console.Write(Array[i] + " "); Console.Write("\n"); } // test the code static void Main(string[] args) { int[] MyArray = {10, 1, 23, 50, 7, -4}; Console.Write("Original Array\n"); PrintArray(MyArray); heapsort(MyArray); Console.Write("\nSorted Array\n"); PrintArray(MyArray); } }
The above code will give the following output:
Original Array 10 1 23 50 7 -4 Sorted Array -4 1 7 10 23 50
<?php // function for heap sort which calls heapify function // to build the max heap and then swap last element of // the max-heap with the first element // exclude the last element from the heap and rebuild the heap function heapsort(&$Array, $n) { for($i = (int)($n/2); $i >= 0; $i--) { heapify($Array, $n-1, $i); } for($i = $n - 1; $i >= 0; $i--) { //swap last element of the max-heap with the first element $temp = $Array[$i]; $Array[$i] = $Array[0]; $Array[0] = $temp; //exclude the last element from the heap and rebuild the heap heapify($Array, $i-1, 0); } } // heapify function is used to build the max heap // max heap has maximum element at the root which means // first element of the array will be maximum in max heap function heapify(&$Array, $n, $i) { $max = $i; $left = 2*$i + 1; $right = 2*$i + 2; //if the left element is greater than root if($left <= $n && $Array[$left] > $Array[$max]) { $max = $left; } //if the right element is greater than root if($right <= $n && $Array[$right] > $Array[$max]) { $max = $right; } //if the max is not i if($max != $i) { $temp = $Array[$i]; $Array[$i] = $Array[$max]; $Array[$max] = $temp; //Recursively heapify the affected sub-tree heapify($Array, $n, $max); } } // function to print array function PrintArray($Array, $n) { for ($i = 0; $i < $n; $i++) echo $Array[$i]." "; echo "\n"; } // test the code $MyArray = array(10, 1, 23, 50, 7, -4); $n = sizeof($MyArray); echo "Original Array\n"; PrintArray($MyArray, $n); heapsort($MyArray, $n); echo "\nSorted Array\n"; PrintArray($MyArray, $n); ?>
The above code will give the following output:
Original Array 10 1 23 50 7 -4 Sorted Array -4 1 7 10 23 50
Time Complexity:
The time complexity of creating a heap is Θ(N) and time complexity of creating a max heap is Θ(logN) and overall time complexity of heap sort is Θ(NlogN).