大顶堆

今天学了一波数据结构,看到一段非常神奇的代码,于是模仿了一下。

package big;
/**
 * 一个大顶堆
 * @author hanhe
 *
 */
public class Stack {
    int size;
    int data[];
    int maxSize;

    public Stack()
    {
        maxSize=50;
        size=0;
        data=new int[maxSize];
        data[0]=Integer.MAX_VALUE;
    }
    public Stack(int maxSize)
    {
        this.maxSize=maxSize;
        size=0;
        data=new int[maxSize];
        data[0]=Integer.MAX_VALUE;   
    }

    /**
     * 判断当前堆是否为空
     * @return 为空时返回true,否则返回false
     */
    public boolean isEmpty()
    {
        if(size==0)
            return true;
        return false;
    }
    public boolean isFull()
    {
        if(size==maxSize)
            return true;
        return false;
    }
    /**
     * 插入一个值
     * @param value 
     */
    public void insert(int value)
    {
        if(isFull())
            return;
        int i=(++size);

        for(;value>data[(int)(i/2)];i/=2)
        {
            data[i]=data[(int)(i/2)];
        }
        data[i]=value;
    }

    /**
     * 取出最大值
     * @return 返回当前堆内的最大值
     */
    public int deleteMax()
    {
        if(this.isEmpty())
            return -1;
        int parent,child;
        int maxItem,temp;

        //数组中的第一个值是当前堆内的最大值
        maxItem=this.data[1];

        //tmp保存当前堆内的之后一个值
        temp=this.data[this.size--];

        /*
         *以下是这段代码的精华部分,用精妙的代码完成大顶堆的转换 
         */

        //parent>=size时,说明当前节点已没有子树
        for(parent=1;parent*2<=this.size;parent=child)
        {
            //使child指向左子树
            child=parent*2;
            //如果左子树等于size说明不存在右子树,如果右子树的值大于左子树的值则让child指向右子树
            if((child!=this.size) && this.data[child]<this.data[child+1])
                child++;
            //如果最后一个节点的值大于子树的值则移动完成,否则用子树的值作为堆顶,将最后的值,与子树的值交换
            if(temp>=this.data[child]) break;
            else    
                this.data[parent]=this.data[child];
        }
        //将最后的值放到指定位置
        this.data[parent]=temp;

        return maxItem;
    }

    public void dfs(int n)
    {
        if(n>size)
            return;
        System.out.println(data[n]);
        dfs(n*2);
        dfs(n*2+1);
    }

    public void print()
    {
        for(int i=1;i<=size;++i)
            System.out.print(data[i]+" ");
        System.out.println();
    }
    public static void main(String args[])
    {
        Stack s=new Stack();

        s.insert(10);
        s.insert(15);
        s.insert(4);

        while(!s.isEmpty())
        {
            System.out.println(s.deleteMax());
        }
    }
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值