1 定义
二叉堆(Binary Heap)本质上是一种完全二叉树,它分为:最大堆、最小堆。
二叉堆可用于堆排序、优先级队列。
二叉堆的特征:
- 最大堆:任何一个父节点的值,都大于等于它左右孩子节点的值。
- 最小堆:任何一个父节点的值,都小于等于它左右孩子节点的值。
2 添加
3 删除
4 构建
两种做法:
- 从前往后,所有节点依次上浮。
- 从后往前,所有节点依次下沉。
5 实现
import java.util.Arrays;
/**
* 二叉堆
* <p>
* 大顶堆
*
* @author wgm
* @since 2021/4/23
*/
public class BinaryHeap {
public static void main(String[] args) {
int[] ints;
ints = new int[] {1, 3, 2, 6, 5, 7, 8, 9, 10, 0};
System.out.println("通过上浮建堆:" + Arrays.toString(upAdjustBuildHeap(ints)));
ints = new int[] {1, 3, 2, 6, 5, 7, 8, 9, 10, 0};
System.out.println("通过下沉建堆:" + Arrays.toString(downAdjustBuildHeap(ints)));
}
private static int[] upAdjustBuildHeap(int[] ints) {
if (ints == null || ints.length <= 1) {
return ints;
}
for (int i = 1; i < ints.length; i++) {
int child = i;
int parent = (child - 1) / 2;
while (parent >= 0) {
if (ints[child] > ints[parent]) {
swap(ints, child, parent);
child = parent;
parent = (child - 1) / 2;
} else {
break;
}
}
}
return ints;
}
private static int[] downAdjustBuildHeap(int[] ints) {
if (ints == null || ints.length <= 1) {
return ints;
}
for (int i = (ints.length - 1 - 1) / 2; i >= 0; i--) {
int parent = i;
int leftChild = parent * 2 + 1;
int rightChild = leftChild + 1;
while (leftChild < ints.length) {
int maxChild = leftChild;
if (rightChild < ints.length && ints[rightChild] > ints[leftChild]) {
maxChild = rightChild;
}
if (ints[maxChild] > ints[parent]) {
swap(ints, maxChild, parent);
parent = maxChild;
leftChild = parent * 2 + 1;
rightChild = leftChild + 1;
} else {
break;
}
}
}
return ints;
}
private static void swap(int[] ints, int index1, int index2) {
int temp = ints[index1];
ints[index1] = ints[index2];
ints[index2] = temp;
}
}
6 测试
D:\program\Java\jdk1.8.0_241\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50014,suspend=y,server=n "-javaagent:C:\Users\GMWANG~1\AppData\Local\Temp\captureAgent2080jars\debugger-agent.jar" -Dfile.encoding=UTF-8 -classpath "D:\program\Java\jdk1.8.0_241\jre\lib\charsets.jar;D:\program\Java\jdk1.8.0_241\jre\lib\deploy.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\access-bridge-64.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\cldrdata.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\dnsns.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\jaccess.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\jfxrt.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\localedata.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\nashorn.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunec.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunjce_provider.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunmscapi.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunpkcs11.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\zipfs.jar;D:\program\Java\jdk1.8.0_241\jre\lib\javaws.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jce.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jfr.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jfxswt.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jsse.jar;D:\program\Java\jdk1.8.0_241\jre\lib\management-agent.jar;D:\program\Java\jdk1.8.0_241\jre\lib\plugin.jar;D:\program\Java\jdk1.8.0_241\jre\lib\resources.jar;D:\program\Java\jdk1.8.0_241\jre\lib\rt.jar;D:\project\untitled\out\production\untitled;D:\program\JetBrains\IntelliJ IDEA 2020.1\lib\idea_rt.jar" BinaryHeap
Connected to the target VM, address: '127.0.0.1:50014', transport: 'socket'
通过上浮建堆:[10, 9, 7, 8, 3, 2, 6, 1, 5, 0]
通过下沉建堆:[10, 9, 8, 6, 5, 7, 2, 3, 1, 0]
Disconnected from the target VM, address: '127.0.0.1:50014', transport: 'socket'
Process finished with exit code 0