java堆算法之插入与删除

来源:互联网 发布:中电四公司知乎 编辑:程序博客网 时间:2024/06/05 08:29
package com.htsc.heap;import java.util.Arrays;public class Heap{    //堆容量    int maxSize;    //当前索引    int currentIndex;      //使用数组来维护堆中节点    Node[] nodeArr;        public Heap()    {        super();    }        public Heap(int maxSize)    {        super();        this.maxSize = maxSize;        this.currentIndex = 0;        this.nodeArr = new Node[maxSize];    }        public Node[] getNodeArr()    {        return nodeArr;    }    public void setNodeArr(Node[] nodeArr)    {        this.nodeArr = nodeArr;    }    public int getMaxSize()    {        return maxSize;    }    public void setMaxSize(int maxSize)    {        this.maxSize = maxSize;    }         //插入    //1.将新插入的元素,放置到队列的尾部。    //2.若该元素大于其父节点,两个元素互换。(上移操作)    //3.循环第2步,直至该元素没有父节点或小于其父节点。    public boolean add(int value){        int index;        //当前节点父索引        if(currentIndex == 0){            nodeArr[currentIndex++] = new Node(value);            return true;        }else{            nodeArr[currentIndex++] = new Node(value);            index = currentIndex - 1;            //堆化            while(nodeArr.length > 1){                int sData = nodeArr[index].getData();                int pData = nodeArr[(index - 1) / 2].getData();                if(sData > pData){                    nodeArr[index].setData(pData);                    nodeArr[(index - 1) / 2].setData(sData);                }                index = (index - 1) / 2;                if(index == 0){                    break;                }            }        }        return true;    }        //删除    //1.移掉顶部的节点。    //2.将队末的元素放置到顶部。    //3.该节点与其子节点中较大的那个比较,若小于它,则交换位置,(下移操作)    //4.循环第3步,直到叶节点或不再比其子节点中较大那个小。    public boolean delete(int index){        int length = nodeArr.length;        nodeArr[index].setData(nodeArr[length - 1].getData());        length = length - 1;        nodeArr = Arrays.copyOf(nodeArr, length);        while(length > 1){            int pValue = nodeArr[index].getData();            if(2*index + 1 <= length - 1 && nodeArr[2*index + 1].getData() > pValue){                nodeArr[index].setData(nodeArr[2*index + 1].getData());                nodeArr[2*index + 1].setData(pValue);                index = 2*index + 1;              }else if(2*index + 2 <= length - 1 && nodeArr[2*index + 2].getData() > pValue){                nodeArr[index].setData(nodeArr[2*index + 2].getData());                nodeArr[2*index + 2].setData(pValue);                index = 2*index + 2;            }else{                break;            }        }        return true;    }    public String show(){        StringBuffer buffer = new StringBuffer("{");        for(int i = 0; i < nodeArr.length - 1; i++){            buffer.append(i+"-"+nodeArr[i].getData()+"|");        }        buffer.append("}");        buffer.substring(0, buffer.length()-1);        return buffer.toString();    }}class Node{    //数据    int data;        public Node()    {        super();    }        public Node(int data)    {        super();        this.data = data;    }        public int getData()    {        return data;    }    public void setData(int data)    {        this.data = data;    }    }