对二叉堆(最大堆)进行排序操作——升序操作
import java.util.Arrays;
//堆排序(最大堆)实现
//二叉堆实际是存储在一个数组中
public class HeapSort {
//“下沉”操作--->当前下沉是要创建一个最大堆,即父节点(小于子节点)下降,最大的元素(子节点)上升。
public static void downAdjust(int[] array, int parentIndex, int length) {
int temp=array[parentIndex];//存储当前要进行下沉的父节点
int childIndex=parentIndex*2+1;//计算当前父节点的左孩子节点
while(childIndex<length) {//判断当前是否还有孩子节点,孩子节点不能大于等于数组的长度
//判断是否有右孩子,且右孩子的值大于左孩子
if(childIndex+1<length && array[childIndex+1]>array[childIndex]) {
childIndex++;//孩子指针指向右孩子
}
//判断父节点是否大于等于当前最大的孩子节点,满足条件直接跳出,终止循环。
if(temp>=array[childIndex]) {
break;
}
//将最大的孩子节点移到当前父节点的位置
array[parentIndex]=array[childIndex];
//将父节点指针,指向最大的孩子节点指针处,以备最后的赋值操作
parentIndex=childIndex;
//计算当前孩子节点的孩子节点(也就是孙子节点),为while循环的终止条件作准备-->改变循环变量的值
childIndex=childIndex*2+1;
}
//将原来的父节点,移到变换后的孩子节点处,以实现最终的下沉目的。
array[parentIndex]=temp;
}
//排序实现
public static void heapSort(int[] array) {
//将一个无序的数组变成最大堆
for(int i=(array.length-2)/2; i>=0; i--) {
downAdjust(array,i,array.length);
}
System.out.println(Arrays.toString(array));
//排序过程
for(int i=array.length-1; i>0; i--) {
//堆顶元素和最后一个叶子元素交换,实际就是数组的第一个元素和当前数组最后一个元素交换。
int temp=array[0];
array[0]=array[i];
array[i]=temp;
//对交换完成的数组进行下沉操作
downAdjust(array,0,i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array=new int[] {1,3,2,6,5,7,8,9,10,0};
heapSort(array);
System.out.println(Arrays.toString(array));
}
}