public class HeapSortClass {

final static int HEAP_SIZE = 13; //堆積樹大小

/*父結點*/
public static int parent(int i)
{
return (int)Math.floor(i / 2);
}

/*左子結點*/
public static int left(int i)
{
return 2 * i;
}

/*右子結點*/
public static int right(int i)
{
return (2 * i + 1);
}

/*單一子結點最大堆積樹調整*/
public static void Max_Heapify(int A[], int i, int heap_size)
{
int l = left(i);
int r = right(i);
int largest;
int temp;
if(l < heap_size && A[l] > A[i])
{
largest = l;
}
else
{
largest = i;
}
if(r < heap_size && A[r] > A[largest])
{
largest = r;
}
if(largest != i)
{
temp = A[i];
A[i] = A[largest];
A[largest] = temp;
Max_Heapify(A, largest, heap_size);
}
}

/*建立最大堆積樹*/
public static void Build_Max_Heap(int A[])
{
for(int i = (HEAP_SIZE-1)/2; i >= 0; i--)
{
Max_Heapify(A, i, HEAP_SIZE);
}
}

/*印出樹狀結構*/
public static void print(int A[])
{
for(int i = 0; i < HEAP_SIZE;i++)
{ System.out.print(A[i]+" ");
}
System.out.println();
}

/*堆積排序程序碼*/
public static void HeapSort(int A[], int heap_size)
{
Build_Max_Heap(A);
int temp;
for(int i = heap_size - 1; i > 0; i--)
{
temp = A[0];
A[0] = A[i];
A[i] = temp;
Max_Heapify(A, 0, i);
}
print(A);
}

/*輸入資料並做堆積排序*/
public static void main(String args[])
{
int A[] = new int[]{19, 1, 10, 14, 16, 4, 7, 9, 3, 2, 8, 5, 11};
HeapSort(A, HEAP_SIZE);
}

}