앞에 포스팅한 최대 힙을 이용한 힙 소트 입니다.
1. 최대힙을 만든다.
2. 배열의 첫번째 원소를 맨뒤로 옴긴다.
3. 힙의 크기를 1 줄인다.
4. 힙의 크기가 0보다 크면 1로 돌아간다.
5. 종료
   
import java.util.Arrays;
public class HeapSort> {
	private T[] heap;
	private int size;
	public static > void sort(T[] array) {
		new HeapSort(array).sort();
	}
	private HeapSort(T[] array) {
		heap = array;
		size = array.length;
	}
	private void initialize() {
		for (int i = size; i >= 0; i--) {
			heapify(i);
		}
	}
	private void sort() {
		initialize();
		while (size > 0) {
			T temp = ExtractMax();
			heap[size] = temp;
		}
	}
	private T ExtractMax() {
		T max = heap[0];
		size--;
		heap[0] = heap[size];
		heapify(0);
		return max;
	}
	private void heapify(int i) {
		if (!hasChild(i))
			return;
		int k = getMaximumChild(i);
		if (heap[i].compareTo(heap[k]) < 0) {
			T temp = heap[i];
			heap[i] = heap[k];
			heap[k] = temp;
			heapify(k);
		}
	}
	private boolean hasChild(int i) {
		return (i * 2 + 1) < size;
	}
	private int getMaximumChild(int i) {
		if ((i * 2 + 2) < size) {
			int max = i * 2 + 1;
			if (heap[i * 2 + 1].compareTo(heap[i * 2 + 2]) < 0)
				max++;
			return max;
		} else if (i * 2 + 1 < size) {
			return i * 2 + 1;
		} else {
			return -1;
		}
	}
	public static void main(String[] args) {
		int size = 50;
		java.util.Random rand = new java.util.Random();
		Integer arr[] = new Integer[size];
		for (int i = 0; i < size; i++) {
			arr[i] = rand.nextInt(3000);
		}
		Integer t[] = Arrays.copyOf(arr, arr.length);
		Arrays.sort(t);
		HeapSort.sort(arr);
		for (Integer i : arr) {
			System.out.print(i + " ");
		}
		System.out.println();
		for (Integer i : t) {
			System.out.print(i + " ");
		}
	}
}