lua实现小根堆


local MinHeap = class("MinHeap")

function MinHeap:ctor()
    self._lbData = {};
    self._dataLen = 0;
end

function MinHeap:push(num)
    table.insert( self._lbData, num);
    self._dataLen = self._dataLen + 1;
    self:sortHeap(#self._lbData); 
end

function MinHeap:sortHeap(nIndex)
    if nIndex <= 1 then
        if nIndex ~= 1 then
            print("sort error")
        end
        return true;
    end
    local fIndex;
    if nIndex%2 == 0 then
        fIndex = nIndex/2;
    else
        fIndex = (nIndex-1)/2;
    end
    if self._lbData[nIndex] < self._lbData[fIndex] then
        self._lbData[nIndex],self._lbData[fIndex] = self._lbData[fIndex],self._lbData[nIndex];
        return self:sortHeap(fIndex);
    else
        return true;
    end
end

function MinHeap:remove()
    local ret = self._lbData[1];
    local endNum = table.remove(self._lbData,self._dataLen);
    self._dataLen = self._dataLen - 1;
    self._lbData[1] = endNum;
    self:sortHeap2(1);    
    return ret;
end

function MinHeap:sortHeap2(nIndex)
    local cIndex = nIndex*2;
    if cIndex <= self._dataLen and self._lbData[cIndex] < self._lbData[nIndex] then
        self._lbData[nIndex],self._lbData[cIndex] = self._lbData[cIndex],self._lbData[nIndex];
        self:sortHeap2(cIndex);
        cIndex = nIndex*2+1;
        if self._lbData[cIndex] < self._lbData[nIndex] then
            self._lbData[nIndex],self._lbData[cIndex] = self._lbData[cIndex],self._lbData[nIndex];
            self:sortHeap2(cIndex)
        end
    end
    cIndex = nIndex*2+1;
    if cIndex <= self._dataLen and self._lbData[cIndex] < self._lbData[nIndex] then
        self._lbData[nIndex],self._lbData[cIndex] = self._lbData[cIndex],self._lbData[nIndex];
        self:sortHeap2(cIndex);
    end
    return true;
end

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值