当前位置:编程学习 > JAVA >>

数据结构之堆

[java]
/**
 * 数据结构学习之队列之最大优先级队列接口
 * @author Sking
 */ 
package 堆; 
 
public inte易做图ce MaxPriorityQueue { 
    /**
     * 判断最大优先级队列是否为空
     * @return 最大优先级队列为空则返回true,否则false
     */ 
    public boolean isEmpty(); 
 
    /**
     * 返回最大优先级队列的元素个数
     * @return 最大优先级队列的元素个数
     */ 
    public int size(); 
 
    /**
     * 返回最大优先级队列的“最大”元素
     * @return 最大优先级队列的“最大”元素,如果队列为空则返回null
     */ 
    public Comparable<?> getMax(); 
 
    /**
     * 插入指定元素到最大优先级队列
     * @param theObject 待插入元素
     */  
    public void put(Comparable<?> theObject); 
 
    /**
     * 移除最大优先级队列的“最大”元素,并返回
     * @return 最大优先级队列的“最大”元素,队列为空则返回null
     */ 
    public Comparable<?> removeMax(); 

 

[java]
/**
 * 数据结构学习之队列之最大优先级队列
 * 使用数组形式的堆结构实现最大优先队列
 * @author Sking*
 */ 
package 堆; 
 
import java.lang.reflect.Array; 
 
public class MaxHeap{ 
    @SuppressWarnings("rawtypes") 
    Comparable[] heap;// 堆数组,索引位置0不使用 
    int size;// 元素个数 
 
    /**
     * 指定堆数组初始容量的构造方法
     * 
     * @param initialCapacity
     *            堆数组的初始容量
     */ 
    public MaxHeap(int initialCapacity) { 
        if (initialCapacity < 1) 
            throw new IllegalArgumentException("initialCapacity must be >= 1"); 
        heap = new Comparable[initialCapacity + 1]; 
        size = 0; 
    } 
 
    /**
     * 无参构造函数,默认堆数组的初始容量为10
     */ 
    public MaxHeap() { 
        this(10); 
    } 
 
    /**
     * 判断堆数组是否为空
     */ 
    public boolean isEmpty() { 
        return size == 0; 
    } 
 
    /**
     * 获取堆数组中的元素个数
     */ 
    public int size() { 
        return size; 
    } 
 
    /**
     * 获取堆数组中的首元素(“最大元素')
     */ 
    @SuppressWarnings({ "rawtypes" }) 
    public Comparable getMax() { 
        return (size == 0) ? null : heap[1]; 
    } 
 
    /**
     * 插入元素导最大堆中,重新调整使数组仍保持“堆特性”
     * 
     * 实现方法:将插入元素放在数组尾部,递归比较当前元素与
     * 父亲节点元素 不满足堆特性的条件,则递归向上往“根"的方
     * 向冒泡(比较移动),直到新元素的父节点元素大于”它“
     */ 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public void put(Comparable theElement) { 
        if (size == heap.length - 1) {// 堆数组已满,分配新空间 
            /*
             * heap.getClass().getComponentType()
             * 获取数组元素类型对应的Class对象
             * Array.newInstance(Class<?>,int)
             * 指定元素类型和数组长度创建新的数组实例
             */ 
            Comparable[] newArray = (Comparable[]) Array.newInstance(heap 
                    .getClass().getComponentType(), 2 * heap.length); 
            // 复制堆元素到新数组中 
            System.arraycopy(heap, 0, newArray, 0, heap.length); 
            heap = newArray; 
        } 
        int currentNode = ++size;// 新元素插入索引 
        // 新元素沿着到根的路径向上冒泡(比较交换),直到新元素的父结点元素“大于”它 
        while (currentNode != 1 
                && heap[currentNode / 2].compareTo(theElement) < 0) { 
            // 父节点元素下移 
            heap[currentNode] = heap[currentNode / 2]; 
            currentNode /= 2; 
        } 
        heap[currentNode] = theElement; 
    } 
 
    /**
     * 从最大堆中移除堆数组的首元素(”最大元素“)
     * 
     * 实现方法:先用堆数组的最后一个元素填补根节点,然后从根
     * 位置开始 沿着不满足堆特性的路径递归进行调整,找到最后
     * 一个元素的适合位置,使其成为最大堆。每次迭代均会涉及到
     * 一棵子树(包含三个元素),找出 该子树中的最大

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,