
Time complexity : O(NlogN)
Build a max heap from the input data.
At this point, the maximum element is stored at the root of the heap.
Replace it with the last item of the heap followed by reducing the size of the heap by 1.
Finally, heapify the root of the tree.
Repeat step 2 while the size of the heap is greater than 1.
// Heap Sort in C#include <stdio.h>// Function to swap the position of two elementsvoid swap(int* a, int* b){ int temp = *a; *a = *b; *b = temp;}// To heapify a subtree rooted with node i// which is an index in arr[].// n is size of heapvoid heapify(int arr[], int N, int i){ // Find largest among root, left child and right child // Initialize largest as root int largest = i; // left = 2*i + 1 int left = 2 * i + 1; // right = 2*i + 2 int right = 2 * i + 2; // If left child is larger than root if (left < N && arr[left] > arr[largest]) largest = left; // If right child is larger than largest // so far if (right < N && arr[right] > arr[largest]) largest = right; // Swap and continue heapifying if root is not largest // If largest is not root if (largest != i) { swap(&arr[i], &arr[largest]); // Recursively heapify the affected // sub-tree heapify(arr, N, largest); }}// Main function to do heap sortvoid heapSort(int arr[], int N){ // 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--) { swap(&arr[0], &arr[i]); // Heapify root element to get highest element at // root again heapify(arr, i, 0); }}// A utility function to print array of size nvoid printArray(int arr[], int N){ for (int i = 0; i < N; i++) printf("%d ", arr[i]); printf("\n");}// Driver's codeint main(){ int arr[] = { 12, 11, 13, 5, 6, 7 }; int N = sizeof(arr) / sizeof(arr[0]); // Function call heapSort(arr, N); printf("Sorted array is\n"); printArray(arr, N);}// This code is contributed by _i_plus_plus_.