java简单实现大顶堆

  • Post author:
  • Post category:java


// 添加一个元素方法
public void pushHeap(int[] heap, int value) {
    // 全局变量,记录堆的大小,添加时+1
    size++;
    // 把新增的元素放在最后
    heap[size - 1] = value;
    if (size == 1) {
        return;
    }
    // 有子节点的最后一个节点
    int loop = size / 2 - 1; 
    int newIndex = size - 1;
    while (loop > 0) {
        int index = loop;
        if (heap[newIndex] > heap[index]) {
            int tmp = heap[index];
            heap[index] = heap[newIndex];
            heap[newIndex] = tmp;
            newIndex = index;
        } else {
            break;
        }
        loop = (index + 1) / 2 - 1;
    }
}
// 推出一个顶端元素
public int pollHeap(int[] heap) {
    // 直接返回顶端元素
    int res = heap[0];
    // 最后一位元素放到顶端
    heap[0] = heap[size - 1];
    int index = 0;
    int left = 1;
    int right = 2;
    // 节点如果比子元素小就循环
    while (heap[index] < (Math.max(heap[left], heap[right]))) {
        int tmp = heap[index];
        // 找到最大的子节点,替代节点的位置
        if (heap[left] > heap[right]) {
            heap[index] = heap[left];
            heap[left] = tmp;
            index = left;
        } else {
            heap[index] = heap[right];
            heap[right] = tmp;
            index = right;
        }
        // 子节点的下标就是原本的下标*2 + 1
        left = index + index + 1;
        right = left + 1;
        if (left > size - 1) {
            break;
        }
    }
    // 把最后一位归0
    heap[size - 1] = 0;
    // 全局变量,记录堆的大小,推出时减1
    size--;
    return res;
}

// 测试用例
public void heap() {
    // 没有做扩容,就给了个不会溢出的值
    int[] heap = new int[20];
    this.pushHeap(heap, 6);
    this.pushHeap(heap, 3);
    this.pushHeap(heap, 4);
    this.pushHeap(heap, 14);
    this.pushHeap(heap, 12);
    this.pushHeap(heap, 24);
    this.pushHeap(heap, 22);
    this.pushHeap(heap, 34);
    this.pushHeap(heap, 2);
    this.pushHeap(heap, 5);
    this.pushHeap(heap, 1);
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
    System.out.println(pollHeap(heap));
}

没有做什么优化,当记个笔记了



版权声明:本文为bar__tender原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。