堆的实现主要有两点:
(1)建堆,将一个无序序列建成一个堆。
(2)在输出堆顶元素之后,调整剩余元素成为一个新的堆。
这两个过程主要做了同一件事情,就是堆的调整,即将当前节点与其左右子节点进行比较,选出最大的元素值并与当前节点值交换(若当前节点最大,则不用交换)。
具体代码实现:
//java 大顶堆的简单实现
import java.util.Arrays;
public class Heap{
public void heapSort(int[] num){
int n = num.length;
for(int i = n/2;i>=0;i--){ //建堆,从n/2开始向上调整
adjustHeap(num, i, n);
}
for(int j=n-1;j>=0;j--){
swap(num,0, j); //交换开始和最后位置上的数字
adjustHeap(num, 0, j); //交换之后再调整堆
}
}
public void adjustHeap(int[] num,int s,int n){ //由于根节点编号是从0开始的,所以其左子树是2*i+1
for(int i=s;i<n;)