排序思想:把数组看成一颗完全二叉树,利用大顶堆或者小顶堆的特性完成排序操作。
public static void heapSort3(int[] arr) {
//构建大顶堆
for(int i = arr.length/2-1;i>=0;i--) {
//从最后一个非叶子节点开始
adjustHeap3(arr,i,arr.length);
}
//循环进行构建大顶堆再和最后一个元素进行交换
for(int i = arr.length - 1 ;i>=0;i--) {
//上面已经构建好了大顶堆要进行交换
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
//再进行构建大顶堆
adjustHeap3(arr,0,i);
}
}
public static void adjustHeap3(int[] arr,int i,int length) {
//记录根节点
int temp = arr[i];
for(int k = 2*i+1;k<length;k=k*2+1) {
if(k+1<length && arr[k] < arr[k+1]) {
//找出孩子节点中最大的一个元素
k++;
}
//然后和根节点进行比较
if(temp < arr[k]) {
arr[i] = arr[k];
i = k;
}
}
//交换完成后把临时元素放入到最后一个位置
arr[i] = temp;
}