/** * @Auther: FAN * @Date: 2018/8/27 22:42 * @Description: **/ public class MaxHeap<Item extends Comparable> { protected Item[] data; // 堆中存储的数量 protected int count; // 堆中可存放的数据个数 protected int capacity; // 构造函数, 构造一个空堆, 可容纳capacity个元素 public MaxHeap(int capacity){ data = (Item[]) new Comparable[capacity+1]; count = 0; this.capacity = capacity; } public MaxHeap(Item[] arr){ data = (Item[])new Comparable[arr.length+1]; capacity = arr.length; for (int i = 0;i<arr.length;i++){ data[i+1] = arr[i]; } count = arr.length; //完全二叉树 第一个非叶子节点的索引是二叉树元素个数/2 for (int i = count/2;i>=1;i--){ shiftDown(i); } } /** * * @return 返回堆中的元素个数 */ public int size(){ return count; } /** * 插入元素 * @param item */ public void insert(Item item){ //判断堆中是否可以继续插入元素 assert capacity > count+1:"堆已满"; data[count+1] = item; count++; shiftUp(count); } /** * 弹出堆顶元素 * @return */ public Item extractMax(){ assert count > 0:"空堆"; Item item = data[1]; swap(1,count); count--; shiftDown(1); return item; } /** * 寻找最后一个堆元素合适的位置 * @param k */ private void shiftDown(int k) { while(2*k<=count){ int j = 2*k; if(j+1<=count&&data[j+1].compareTo(data[j])>0){ j++; } if (data[k].compareTo(data[j])>=0){ break; } swap(k,j); k = j; } } /** * 找到元素合适的位置 * @param k */ private void shiftUp(int k){ while (k > 1 && data[k/2].compareTo(data[k]) < 0){ swap(k/2,k); k/=2; } } /** * 交换元素位置 * @param i * @param j */ private void swap(int i,int j) { Item tmp = data[i]; data[i] = data[j]; data[j] = tmp; } /** * * @return 返回一个布尔值, 表示堆中是否为空 */ public boolean isEmpty(){ return count == 0; } public static void main(String[] args) { MaxHeap<Comparable<Integer>> maxHeap = new MaxHeap<>(100); for (int i = 0;i<100;i++){ maxHeap.insert((int)(Math.random()*100)); } while(!maxHeap.isEmpty()){ System.out.print(maxHeap.extractMax()+" "); } } }