排序

堆排序:
push:以数组保存,父节点下标为 i/2,左儿子下标 2*i,右儿子 2 *i+1,在末尾加入新元素,然后上移调整。在队列头前加入一个大数,以消除边界条件判断。
pop:末尾元素放到堆顶,然后下移。实际实现中,末尾的元素都只在最后才被放入空穴。

class Heap{//大顶堆
private:
    vector<int> member;
    int tail;
    int top;
public:
    Heap(){
        tail=0;top=1;
        member.push_back(0x3f3f3f3f);//为了消除边界条件的小trick
    }
    Top(){
        if(tail>=top)
        return member[top];
    }
    void push(int t){
        int i;
        member.push_back(t);
        tail++;
        for(i=tail; member[i/2] < t; i/=2)
            member[i]=member[i/2];
        member[i]=t;
    }
    int pop(){
        int ret=member[1];
        int i=1;
        int x=member[tail--];

        while(2*i<=tail){//有儿子,等于时只有左儿子
            int l=2*i,r=2*i+1;
            if(r<=tail && member[l]<member[r])   l=r;//若右儿子存在,选出要交换的儿子
            if(member[l]<=x)  break;//在合适的位置
            member[i]=member[l];
            i=l;
        }

        member[i]=x;
        return ret;
    }
    isempty(){
        return tail<top;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值