基于数组实现的最大堆

Posted *平芜尽处是春山*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于数组实现的最大堆相关的知识,希望对你有一定的参考价值。

基于数组实现的最大堆

三步骤:
1、向堆中添加元素
2、取出堆的最大值
3、将数组调整为堆

package heap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;

public class MaxHeap 
    private List<Integer> data;

    public MaxHeap() 
        this(10);
    

    public MaxHeap(int initCap) 
        this.data = new ArrayList<>(initCap);
    

    public MaxHeap(int[] arr) 
        data = new ArrayList<>(arr.length);
        for(int i : arr) 
            data.add(i);
        
        for(int i = parent(data.size() - 1);i >= 0;i--) 
            siftDown(i);
        
    

    public void add(int value) 
        this.data.add(value);
        siftUp(data.size() - 1);
    

    public int extractMax() 
        if(data.size() == 0) 
            throw new NoSuchElementException("heap is empty!");
        
        int max = data.get(0);
        int lastElement = data.get(data.size() - 1);
        data.set(0,lastElement);
        data.remove(data.size() - 1);
        siftDown(0);
        return max;
    

    private void siftDown(int i) 
        while(leftChild(i) < data.size()) 
            int j  = leftChild(i);
            if(j + 1 < data.size() && data.get(j + 1) > data.get(j)) 
                j = j+ 1;
            
            if(data.get(i) >= data.get(j)) 
                break;
             else 
                swap(i,j);
                i = j;
            
        
    

    private void siftUp(int k) 
        while(k > 0 && data.get(k) > data.get(parent(k))) 
            int parent = parent(k);
            swap(k,parent);
            k = parent;
        
    

    private void swap(int k,int parent) 
        int temp = data.get(k);
        data.set(k,data.get(parent));
        data.set(parent,temp);
    

    private int parent(int k)
        return (k - 1) >> 1;
    

    private int leftChild(int k) 
        return (k << 1) + 1;
    

    private int rightChild(int k) 
        return (k << 1) + 2;
    

    @Override
    public String toString() 
        return data.toString();
    

    public static void main(String[] args) 
        int[] data = 17,90,68,12,15,14,70,30,20;
        MaxHeap heap = new MaxHeap(data);
        for (int i = 0; i < data.length; i++) 
            data[i] = heap.extractMax();
        
        System.out.println(Arrays.toString(data));
    

运行截图:

以上是关于基于数组实现的最大堆的主要内容,如果未能解决你的问题,请参考以下文章

基于最大堆实现最大优先队列代码

基于二叉树和数组实现限制长度的最优Huffman编码

Java数据结构与算法解析(十四)——二叉堆

Java数据结构与算法解析(十四)——二叉堆

基于最大堆的堆排序算法

最大堆