欢迎 💛点赞 🌟收藏 💫关注
🏆堆
一、🎯堆的定义
堆的概念
堆是一种特殊的完全二叉树,它通过一维数组顺序存储关键码集合K={k0,k1,k2,...,kn-1},并遵循特定的顺序关系来定义。具体来说,若对于任意节点Ki,都满足Ki <= K2i+1 且 Ki <= K2i+2(或Ki >= K2i+2),则称这样的堆为小堆。堆分为两种类型:大根堆和小根堆:
- 小根堆:根节点的值最小,父节点的值小于或等于其子节点的值;
- 大根堆:根节点的值最大,父节点的值大于或等于其子节点的值;

堆的性质
- 堆是一个完全二叉树;
- 堆中任意节点的值总是不大于(或不小于)其父节点的值;
二、🀄️堆的构建
大堆
构建过程:

代码实现:
public class Heap {
    public int[] elem; // 存储元素的数组
    public int usedSize; // 已使用的数组大小
    public Heap() {
        this.elem = new int[10];
    }
    // 初始化堆
    public void initHeap(int[] elem) {
        for (int i = 0; i < elem.length; i++) {
            this.elem[i] = elem[i];
            usedSize++;
        }
    }
    // 构建大堆,通过将父节点向下调整实现
    public void creatHeap() {
        for (int parent = (usedSize - 1) / 2; parent >= 0; parent--) {
            siftDown(parent, usedSize);
        }
    }
    public void siftDown(int parent, int usedSize) {
        int child = 2 * parent + 1;
        while (child < usedSize) {
            if (child + 1 < usedSize && elem[child] < elem[child + 1]) {
                child++;
            }
            if (elem[child] > elem[parent]) {
                swap(elem, child, parent);
                parent = child;
                child = 2 * parent + 1;
            } else {
                break;
            }
        }
    }
    private void swap(int[] elem, int i, int j) {
        int tmp = elem[i];
        elem[i] = elem[j];
        elem[j] = tmp;
    }
}
小堆
小堆的构建思路与大堆相似,区别在于父节点的值需要小于子节点的值。
代码实现:
```java
private void swap(int[] elem, int i, int j) {
    int tmp = elem[i];
    elem[i] = elem[j];
    elem[j] = tmp;
}
public void creatHeap2() {
    for (int parent = (usedSize - 1) / 2; parent >= 0; parent--) {
        siftDown2(parent, usedSize);
    }
}
public void siftDown2(int parent, int usedSize) {
    int child = 2 * parent + 1;
    while (child < usedSize) {
        if (child + 1 < usedSize && elem[child] > elem[child + 1]) {
            child++;
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4516.html
 
                
