堆:利用完全二叉树来维护一维数组。
大顶堆:父节点的值大于子节点的值。
小顶堆:父节点的值小于子节点的值。
如何利用堆进行排序?
大顶堆:升序排序
小顶堆:降序排序
以小顶堆为例对数组进行排序
再图中可以发现
子节点的索引父节点的索引的关系
左节点 = Father2+1
右节点 = Father2+2
public static void swap(int[] nums,int l,int r) {
int temp = nums[r];
nums[r] = nums[l];
nums[l] = temp;
}
//调整堆,n是数组长度
public static void heapJust(int[] tree,int i,int n) {
if(i>=n) return;//出口:当i调整的位置超过n则跳出
int min = i;//降入当前节点的值最大
int cl = 2*i+1;//左孩子
int cr = 2*i+2;//右孩子
if(cl<n && tree[cl]<tree[min]) {
min = cl;
}
if(cr<n && tree[cr]<tree[min]) {
min = cr;
}
//说明子孩子的值大于当前节点的值
if(min != i) {
swap(tree,i,min);
heapJust(tree,min,n);
}
}
//创建堆,n是数组长度
public static void BuildHeap(int[] tree,int n) {
int lastNode = (n-2)>>1;
for(int i = lastNode;i>=0;i--) {
heapJust(tree,i,n);
}
}
public static void main(String[] args){
}