堆:大顶堆:在完全二叉树的基础上,每个节点的值都大于或等于他的左右孩子
小顶堆:在完全二叉树的基础上,每个节点的值都小于或等于他的左右孩子
步骤:
1.定义一个游标p,然后从后向前遍历
2.找到p的左右孩子当中的最大值,和p的值进行对比,如果父节点的值大,不需要互换位
置,如果小,则互换位置
3.将最大值放入堆顶,然后进行维护,p指向堆顶,然后c指向p的孩子当中的最大值进行对比
,然后p指向c,c指向原来c的孩子当中的最大值,然后依次向下对比,直到c指向空
4.之后堆顶元素和堆底元素进行互换,然后触发维护
代码:
import java.util.Arrays;
public class HeapSort {
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;
}
}