import java.util.*;
public class HeapSort {
public int[] heapSort(int[] A, int n) {
buildmaxHeap(A); // 第一次构建大顶堆
for(int i = n-1;i > 0;i--){
swap(A,i,0);
maxHeap(A,i,0);
}
return A;
}
public void buildmaxHeap(int[] array){
if(array == null || array.length <= 1){
return;
}
int half = array.length / 2;
for(int i = half;i >= 0;i--){
// 从树的最底层开始构建。 half * 2 + 1 为树最右下方的左节点
maxHeap(array,array.length,i);
}
}
public void maxHeap(int[] array,int heapSize,int index){
int left = index * 2 +1;
int right = index * 2 +2;
int largest = index;
if(left < heapSize && array[left] > array[index]){
largest = left;
}
if(right < heapSize && array[right] > array[largest]){
largest = right;
}
// 选出父节点和2个子节点中最大的位置
if(index != largest){
swap(array,index,largest);
// 交换顺序后,看以当前的节点为父节点下还有没有子节点比它大的
maxHeap(array,heapSize,largest);
}
}
public void swap(int[] array,int index,int largest){
int temp = array[index];
array[index] = array[largest];
array[largest] = temp;
}
}