范例-数组排序-比较排序-选择排序升级版:优先级队列

来源:互联网 发布:隔音毡 知乎 编辑:程序博客网 时间:2024/06/11 14:46
参考了范例-数组排序-比较排序-选择排序中的代码,实现了优先级队列,速度还行,希望大家能够喜欢。
//优先级队列
class priorqueue{
    
ctor(...){
        
var priorarr={}
        
var infoarr={}
        
var heapsize = 0;
        
var arg={...}
        
var cmpfun
        
if #arg>=1
            cmpfun=arg[1]
        
else
            cmpfun=
function(prior1,prior2){
                    
return prior1>prior2
                }
    }
    size=
function(){
        
return heapsize
    }
    isempty=
function(){
        
return heapsize==0
    }
    push=
function(prior,info){
        heapsize++
        
var pushnodeind=heapsize;
        
while pushnodeind>1{
            
var parentnodeind=..math.floor(pushnodeind/2)
            
if !cmpfun(prior,priorarr[parentnodeind])
                
break
            priorarr[pushnodeind]=priorarr[parentnodeind]
            infoarr[pushnodeind]=infoarr[parentnodeind]
            pushnodeind=parentnodeind
        }
        priorarr[pushnodeind]=prior
        infoarr[pushnodeind]=info
    }
    pop=
function(){
        
if heapsize<=0
            
return null
        
if heapsize==1{
            heapsize=0
            
return priorarr[1],infoarr[1]
        }
        
var popprior=priorarr[1]
        
var popinfo=infoarr[1]
        
var endprior=priorarr[heapsize]
        
var endinfo=infoarr[heapsize]
        heapsize--
        
var endind=1
        
var leftind=2*endind
        
var rightind=leftind+1
        
var largest
        
while leftind<=heapsize{
            
if cmpfun(priorarr[leftind],endprior){
                largest=leftind
                
if rightind<=heapsize and cmpfun(priorarr[rightind],priorarr[leftind])
                    largest=rightind
            }
            
else{
                
if rightind<=heapsize and cmpfun(priorarr[rightind],endprior)
                    largest=rightind
                
else
                    
break
            }
            priorarr[endind]=priorarr[largest]
            infoarr[endind]=infoarr[largest]
            endind=largest
            leftind=2*endind
            rightind=leftind+1
        }
        priorarr[endind]=endprior
        infoarr[endind]=endinfo      
        
return popprior,popinfo
    }
}

io.open()
math.randomize()
cmp=
function(e1,e2){
    
return e1<e2
}
pq=priorqueue(cmp)
for i=1;10
    pq.push(math.random(1,20),i)
for i=1;pq.size()
    io.print(pq.pop())
io.print(pq.isempty())
execute("pause")
io.close();

原创粉丝点击