Heap Sort in Data Structure
Heap Sort
A heap is a tree-based data structure that has specific properties.
- Heap is always a complete binary tree (CBT). That is, all the nodes of the tree are completely filled.
- If the value placed in each node is greater than or equal to its two children, then that heap is called max heap.
- If the value placed in each node is less than or equal to its two children, then that heap is called min-heap.
- If you want to sort the list in ascending order (increasing order), then you create the min-heap.
- If you want to sort the list in descending order (decreasing order), then you create the max heap.
Complexity table of Heap sort
Complexity | Best case | Average case | Worst case |
Time | O(nlogn) | O(nlogn) | O(nlogn) |
Space | O(1) |
Selection sort algorithm
Heapsort (A) Build_Max_heap(A) for i ? length[A] down to 2 do exchange A[i] ? A[1] heapsize(A) ? heapsize (A – 1) Max_heapify (A, 1)
This algorithm is for max heap sort.
Step 1: Create a new node.
Step 2: Assign a value to the node.
Step 3: Compare the value of the child node with the value of the parent node.
Step 4: If the child node value is greater than the parent node value, then interchange them.
Step 5: Repeat steps 3 and 4 until the heap is sorted correctly.
Build_Max_heap(A) heapsize(A) ? length[A] for i ? length[A / 2] down to 1 Max_heapify (A, i)
Max_heapify (A, i) l ? left[i] r ? right[i]if l <= heapsize(A) and A[l] > A[i] then largest ? l also, largest ? iif r <= heapsize(A) and A[r] > A[largest]then largest ? rdo if i ? largestexchange A[i] ? A[largest]Max_heapify (A, largest)
Heap sort program in C language
#include<stdio.h> int val; void heapify(int arr[], int size, int i) { int largest = i; int left = 2*i + 1; int right = 2*i + 2; if (left < size && arr[left] >arr[largest]) largest = left; if (right < size && arr[right] > arr[largest]) largest = right; if (largest != i) { val = arr[i]; arr[i]= arr[largest]; arr[largest] = val; heapify(arr, size, largest); } } void heapSort(int arr[], int size) { int i; for (i = size / 2 - 1; i >= 0; i--) heapify(arr, size, i); for (i=size-1; i>=0; i--) { val = arr[0]; arr[0]= arr[i]; arr[i] = val; heapify(arr, i, 0); } } void main() { int arr[] = {20, 50, 40, 10, 90, 80, 60, 70, 30, 100}; int i; int size = sizeof(arr)/sizeof(arr[0]); heapSort(arr, size); printf("heap sorted elements\n"); for (i=0; i<size; ++i) printf("%d\n",arr[i]); }
Output
heap sorted elements 10 20 30 40 50 60 70 80 90 100
Heap sort program in java language
public class HeapSort { public void sort(int arr[]) { int n = arr.length; // Build max heap for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } // Heap sort for (int i = n - 1; i >= 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // Heapify root element heapify(arr, i, 0); } } void heapify(int arr[], int n, int i) { // Find largest among root, left child and right child int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l < n && arr[l] > arr[largest]) largest = l; if (r < n && arr[r] > arr[largest]) largest = r; // Swap and continue heapifying if root is not largest if (largest != i) { int swap = arr[i]; arr[i] = arr[largest]; arr[largest] = swap; heapify(arr, n, largest); } } // Function to print an array static void printArray(int arr[]) { int n = arr.length; for (int i = 0; i < n; ++i) System.out.print(arr[i] + " "); System.out.println(); } // Driver code public static void main(String args[]) { int arr[] = { 20, 50, 40, 10, 90, 80, 60, 70, 30, 100 }; HeapSort hs = new HeapSort(); hs.sort(arr); System.out.println("heap sorted elements"); printArray(arr); } }
Output
heap sorted elements 10 20 30 40 50 60 70 80 90 100