Heap Sort
Heap sort is a comparison-based sorting technique based on Binary Heap data structure. It is similar to the selection sort where we first find the minimum element and place the minimum element at the beginning. Repeat the same process for the remaining elements.
Time Complexity:
1)The best-case time complexity of heap sort is O(n logn)
2)The average case time complexity of heap sort is O(n log n).
3)The worst-case time complexity of heap sort is O(n log n).
Space Complexity:
The space complexity of Heap sort is O(1).
Java
python
JavaScript
c
// JavaScript program for implementation // of Heap Sort function sort( arr) { var N = arr.length; // Build heap (rearrange array) for (var i = Math.floor(N / 2) - 1; i >= 0; i--) heapify(arr, N, i); // One by one extract an element from heap for (var i = N - 1; i > 0; i--) { // Move current root to end var temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // call max heapify on the reduced heap heapify(arr, i, 0); } } // To heapify a subtree rooted with node i which is // an index in arr[]. n is size of heap function heapify(arr, N, i) { var largest = i; // Initialize largest as root var l = 2 * i + 1; // left = 2*i + 1 var r = 2 * i + 2; // right = 2*i + 2 // If left child is larger than root if (l < N && arr[l] > arr[largest]) largest = l; // If right child is larger than largest so far if (r < N && arr[r] > arr[largest]) largest = r; // If largest is not root if (largest != i) { var swap = arr[i]; arr[i] = arr[largest]; arr[largest] = swap; // Recursively heapify the affected sub-tree heapify(arr, N, largest); } } /* A utility function to print array of size n */ function printArray(arr) { var N = arr.length; for (var i = 0; i < N; ++i) document.write(arr[i] + " "); } var arr = [12, 11, 13, 5, 6, 7]; var N = arr.length; sort(arr); document.write( "Sorted array is"); printArray(arr, N);
// Java program for implementation of Heap Sort public class HeapSort { public void sort(int arr[]) { int N = arr.length; // Build heap (rearrange array) for (int i = N / 2 - 1; i >= 0; i--) heapify(arr, N, i); // One by one extract an element from heap for (int i = N - 1; i > 0; i--) { // Move current root to end int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // call max heapify on the reduced heap heapify(arr, i, 0); } } // To heapify a subtree rooted with node i which is // an index in arr[]. n is size of heap void heapify(int arr[], int N, int i) { int largest = i; // Initialize largest as root int l = 2 * i + 1; // left = 2*i + 1 int r = 2 * i + 2; // right = 2*i + 2 // If left child is larger than root if (l < N && arr[l] > arr[largest]) largest = l; // If right child is larger than largest so far if (r < N && arr[r] > arr[largest]) largest = r; // If largest is not root if (largest != i) { int swap = arr[i]; arr[i] = arr[largest]; arr[largest] = swap; // Recursively heapify the affected sub-tree heapify(arr, N, largest); } } /* A utility function to print array of size n */ 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's code public static void main(String args[]) { int arr[] = { 12, 11, 13, 5, 6, 7 }; int N = arr.length; // Function call HeapSort ob = new HeapSort(); ob.sort(arr); System.out.println("Sorted array is"); printArray(arr); } }
# Python program for implementation of heap Sort # To heapify subtree rooted at index i. # n is size of heap def heapify(arr, N, i): largest = i # Initialize largest as root l = 2 * i + 1 # left = 2*i + 1 r = 2 * i + 2 # right = 2*i + 2 # See if left child of root exists and is # greater than root if l < N and arr[largest] < arr[l]: largest = l # See if right child of root exists and is # greater than root if r < N and arr[largest] < arr[r]: largest = r # Change root, if needed if largest != i: arr[i], arr[largest] = arr[largest], arr[i] # swap # Heapify the root. heapify(arr, N, largest) # The main function to sort an array of given size def heapSort(arr): N = len(arr) # Build a maxheap. for i in range(N//2 - 1, -1, -1): heapify(arr, N, i) # One by one extract elements for i in range(N-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] # swap heapify(arr, i, 0) # Driver's code if __name__ == '__main__': arr = [12, 11, 13, 5, 6, 7] # Function call heapSort(arr) N = len(arr) print("Sorted array is") for i in range(N): print("%d" % arr[i], end=" ")
// Heap Sort in C #include
// Function to swap the position of two elements void 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 heap void 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 sort void 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 n void printArray(int arr[], int N) { for (int i = 0; i < N; i++) printf("%d ", arr[i]); printf("\n"); } // Driver's code int 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); }