最大堆

自定义最大堆

package com.njau.dataStructure;

import java.util.ArrayList;
import java.util.PriorityQueue;

/** * @author 张文军 * @Description:自定义最大堆 * @Company:南京农业大学工学院 * @version:1.0 * @date 2019/9/713:00 */
public class MaxHeap<E extends Comparable<E>> {
    private ArrayList<E> data;

    public MaxHeap() {
        this.data = new ArrayList<E>();
    }

    public int getSize() {
        return data.size();
    }

    public Boolean isEmpty() {
        return data.size() == 0;
    }

    /** * 返回父亲节点的索引 * * @param index 当前节点 * @return 父亲节点 */
    private int parent(int index) {
        if (index == 0) {
            throw new RuntimeException("index-0 doesn`t have parent ");
        }
        return (index - 1) / 2;
    }

    /** * 返回左孩子节点的索引 * * @param index 当前节点 * @return 当前索引的左孩子的索引 */
    private int leftChild(int index) {
        return index * 2 + 1;
    }

    /** * 返回右孩子节点的索引 * * @param index 当前节点 * @return 当前索引的右孩子的索引 */
    private int rightChild(int index) {
        return index * 2 + 2;
    }

    public void add(E e) {
        data.add(e);
        siftUp(data.size() - 1);
    }

    /** * 用浮动的方式调整堆中新添加的元素的位置 * @param index */
    private void siftUp(int index) {
        /** * 节点索引小于1 并且 节点值大于父亲节点时进行调整 */
        while (index > 0 && data.get(parent(index)).compareTo(data.get(index)) < 0) {
            /** * 节点交换 */
            swap(parent(index), index);
        }
    }

    /** * 交换元素 * @param parent 当前节点的父节点 * @param index 当前节点 */
    private void swap(int parent, int index) {
        if (parent < 0 || parent > data.size() || index < 0 || index > data.size()) {
            throw new RuntimeException("Index is illegal ");
        }
        E e = data.get(parent);
        data.set(parent, data.get(index));
        data.set(index, e);
    }

    /** * 取出堆中最大元素 并重新调整堆结构 * @return */
    public E ExtractMax() {
        E ret = fundMax();
        /** * 将首个元素和微元素交换位置 */
        swap(0, data.size() - 1);
        /** * 删除尾元素 */
        data.remove(data.size() - 1);
        /** * 调整节点位置 */
        siftDown(0);
        return ret;
    }

    /** * 用下沉的方式 调整当前节点和左右子节点的位置 * @param index 当前节点索引 */
    private void siftDown(int index) {
        PriorityQueue<E> priorityQueue = new PriorityQueue<>();
    }

    /** * 查看堆中最大元素 * @return 堆中最大元素 */
    private E fundMax() {
        if (data.size() == 0) {
            throw new RuntimeException("Can not findMax when heap is empty ");
        }
        return data.get(0);
    }

}

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-04 05:12
kalistar:简历留六个字,北京大学(本科),黑体加粗,看看哪个hr不长眼敢碰瓷我们北大✌
点赞 评论 收藏
分享
点赞 评论 收藏
分享
bg27强双非本,目前在学习golang后端gin框架部分,在b站找了一个轮子项目敲了一下,技术栈是gin&nbsp;+&nbsp;gorm&nbsp;+&nbsp;mysql&nbsp;+&nbsp;redis。我目前的想法是这一个月学习408和go八股以及刷算法然后在12月找个寒假实习然后大三下开始准备考研。我是考研意愿比较强烈,想问一下我是应该all&nbsp;in其中一个方向吗,我感觉我实习对我考研来说也是没什么帮助的好像。
牛客28967172...:毕业工作,考研,考公是完全不同的方向。 99%的人拼尽全力也只能把一个做好(能做好都已经是佼佼者了,比如进进大厂,考985或者考公) 如果你确定要考研可以不用学任何就业技术框架,也不用实习经验,刷题背知识点就行,但注意必须考92院校起步,因为这个年代双非硕毕业后完全不如双非本(互联网行业),可以说双非硕在互联网就业完全是负收益
投递哔哩哔哩等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务