//调整待调整位置结点
public static void heapAdjust(int a[], int i, int length){
int demo = a[i]; //待调整位置结点
int child = 2*i+1; //左孩子结点的位置。
while (child<length){
if(child+1<length && a[child+1]>a[child]){ //如果右孩子比左孩子大
child++; //右孩子结点位置
}
if(a[i]<a[child]){ //如果待调整位置结点小于孩子结点中最大的
a[i] = a[child]; //将孩子结点上移代替父结点
i = child; //新的待调整结点位置
child = 2*i+1; //新的左孩子结点位置
}else {
break; //反之不需要调整
}
a[i] = demo; //将待调整结点的值给新的待调整结点
}
}
//堆排序
public static void heapSort(int a[], int length) {
//此循环为了初始化堆
for (int i = (length - 1) / 2; i >= 0; i--) {
heapAdjust(a, i, length);
}
for (int i = length - 1; i >= 0; i--) {
//交换堆顶元素H[0]和堆中最后一个元素
int temp = a[i];
a[i] = a[0];
a[0] = temp;
//每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整
heapAdjust(a, 0, i);
}
}
//主函数
public static void main(String[] args) {
int a[] = {3,2,5,8,4,7,6,9};
heapSort(a,8);
//输出
for(int x=0; x<8; x++){
System.out.print(a[x]+" ");
}
System.out.println();
}