从下往上进行构建。大顶堆从上往下看,上面大下面小,排好序后将顶部最大值和最后面的值互换,互换后将下面最大值暂时屏蔽,其余元素按大顶堆排序,然后再交换,再排序,最终效果如下:(参考网站https://www.cnblogs.com/chengxiao/p/6129630.html)
java代码实现:
import java.util.Arrays;
public class duiSort {
public static void main(String[] args) {
int[] arr = {16,5,1,0,7,9,4,2};
for(int p = arr.length-1;p>=0;p--) {
adjestHeap(arr,p,arr.length);
}
//堆顶元素和堆底元素互换,维护大顶堆
for(int i =arr.length-1;i>0;i--) {
int temp=arr[i];
arr[i]=arr[0];
arr[0] = temp;
//维护大顶堆
adjestHeap(arr,0,i);
}
System.out.println(Arrays.toString(arr));
}
public static void adjestHeap(int[] arr,int parent,int length) {
//temp代表父节点的值,将父节点的值取出
int temp = arr[parent];
//左孩子
int lChild = 2*parent+1;
//构建和维护的代码都在这
while(lChild<length) {
int rChild = lChild+1; //右孩子
//判断要有右孩子并且找到左右孩子里面大的并进行指向
if(rChild<length && arr[lChild]<arr[rChild]) {
lChild++;
}
//如果父节点的值大于孩子节点的值,方法结束
if(temp>=arr[lChild]) {
break;
}
//将孩子节点的值赋给父亲节点位置
arr[parent] = arr[lChild];
parent = lChild;
lChild = 2 * lChild+1;
}
arr[parent] = temp;
}
}