优先队列---最大堆:Java语言实现

1 堆(heap)的简单介绍

       堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
a. 堆中某个节点的值总是不大于或不小于其父节点的值;
b. 堆总是一棵完全二叉树。
       将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
              (ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)

       若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值。由此,若序列{k1,k2,…,kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。(摘自百度百科:堆)

2 最大堆的Java实现

     最大堆和最小堆的实现类似,这里只介绍了最大堆的实现,关于堆排序的内容,在后续的博文中会单独介绍。

package Binary_Tree_Study;

/**
 * Created by Administrator on 2018/5/21.
 */
public class MaxHeap {
    private int[] array;//基于堆的完全二叉树
    private int N = 0;//存储在array[1...N]中,array[0]没有使用
    private int maxN;//堆的容量
    public MaxHeap(int maxN) {
        this.maxN = maxN;
        this.array = new int[maxN+1];
    }

    //堆是否为空
    public boolean isEmpty() {
        return N == 0;
    }

    //获取堆的大小
    public int size() {
        return N;
    }

    //堆是否已满
    public boolean isFull() {
        return N == maxN;
    }

    //插入操作
    public void insert(int v) {
        if(isFull()) {
            System.out.println("最大堆已满");
            return;
        }
        array[++N] = v;
        swim(N);
    }

    //删除最大元素
    public int delMax(){
        if(isEmpty()) {
            System.out.println("最大堆已空");
            return array[0];
        }
        int max = array[1];//从根节点得到最大元素
        exch(1,N--);//将其与最后一个结点交换
        sink(1);//恢复堆的有序性
        return max;

    }

    //辅助方法

    //比较i是否小于j
    private boolean less(int i, int j) {
        if((array[i] -array[j]) < 0)
            return true;
        else
            return false;
    }

    //交换元素
    private void exch(int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    //上浮操作
    private void swim(int k) {
        while (k > 1 && less(k/2, k)) {
            exch(k/2, k);
            k = k/2;
        }
    }

    //下沉操作
    private void sink(int k) {
        while (2*k <= N) {
            int j = 2*k;
            if(j < N && less(j, j+1))
                j++;
            if(!less(k, j))
                break;
            exch(k, j);
            k = j;
        }
    }
}

3 参考资料

[1] 算法第四版 - 算法

[2] 数据结构与算法经典问题解析

[3] 数据结构与算法分析 c语言描述

后记:

       后续看了一些博文,感觉写得挺不错的,在此备注一下,以便以后查阅。

1. 堆——神奇的优先队列(上) 【经典】

2. 基本数据结构――堆的基本概念及其操作
3. 数据结构--堆的实现之深入分析
4. 算法与数据结构-堆的基本操作C语言实现
5. 二叉堆(一)之 图文解析 和 C语言的实现
6. 堆树(最大堆、最小堆)详解
7. 【算法】堆,最大堆(大顶堆)及最小堆(小顶堆)的实现

你可能感兴趣的:(数据结构与算法)