package com.interview.sort; /** * Date 04/03/2015 * @author tusroy * * Heap Sort * Given an array sort it using heap sort * * Solution : * First convert the original array to create the heap out of the array * Then move the max element to last position and do heapify to recreate the heap * with rest of the array element. Repeat this process * * Time complexity * O(nlogn) * * Test cases * Null array * 1 element array * 2 element array * sorted array * reverse sorted array */ public class HeapSort { public void sort(int arr[]){ for(int i=1; i < arr.length; i++){ heapAdd(arr, i); } for(int i = arr.length-1; i > 0 ; i--){ swap(arr, 0, i); heapify(arr, i-1); } } private void heapify(int arr[], int end){ int i = 0; int leftIndex; int rightIndex; while(i <= end){ leftIndex = 2*i + 1; if(leftIndex > end){ break; } rightIndex = 2*i + 2; if(rightIndex > end){ rightIndex = leftIndex; } if(arr[i] >= Math.max(arr[leftIndex], arr[rightIndex])){ break; } if(arr[leftIndex] >= arr[rightIndex]){ swap(arr, i, leftIndex); i = leftIndex; }else{ swap(arr, i, rightIndex); i = rightIndex; } } } private void swap(int arr[], int x, int y){ int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } private void heapAdd(int arr[], int end){ int i = end; while(i > 0){ if(arr[i] > arr[(i-1)/2]){ swap(arr, i, (i-1)/2); i = (i - 1)/2; }else{ break; } } } public static void main(String args[]){ HeapSort hs = new HeapSort(); int arr[] = {-1,5,8,2,-6,-8,11,5}; hs.sort(arr); for(int a : arr){ System.out.println(a); } } }