#include<stdio.h>

int left(int i);
int right(int i);
void max_heapify(int A[], int i, int n);
void build_max_heap(int A[], int n);
void heapsort(int A[], int n);
void exchange(int A[], int n, int m);
void print_array(int A[], int size);

int main(void)
{
	int arr[] = {16, 4, 10, 14, 7, 9, 3, 2, 8, 1};
    int arr_size = sizeof(arr)/sizeof(arr[0]);
	print_array(arr, arr_size);
	heapsort(arr, arr_size);
	print_array(arr, arr_size);
	
	return 0;
}

int left(int i)
{
	return 2*(i+1) - 1;
}

int right(int i)
{
	return 2*(i+1);
}


void max_heapify(int A[], int i, int n)
{
	int l = left(i);
	int r = right(i);
	
	int largest;

	if ((l <= n-1) && (A[l] > A[i]))
		largest = l;
	else largest = i;
	
	if ((r <= n-1) && (A[r] > A[largest]))
		largest = r;
	
	if (largest != i)
	{
		exchange(A, i, largest);
		max_heapify(A, largest, n);
	}
}

void build_max_heap(int A[], int n)
{
	int i;
	for(i=(n-1)/2; i>=0; i--)
		max_heapify(A, i, n);
}

void heapsort(int A[], int n)
{
	build_max_heap(A, n);
	int i;
	for(i=n-1; i>=1; i--)
	{
		exchange(A, 0, i);
		max_heapify(A, 0, i);
	}
}

void print_array(int A[], int size)
{
    int i;
    for (i=0; i < size; i++)
        printf("%d ", A[i]);
    printf("\n");
}

void exchange(int A[], int n, int m)
{
	int temp;
	temp = A[n];
	A[n] = A[m];
	A[m] = temp;
}
