参考了范例-数组排序-比较排序-选择排序中的代码,实现了优先级队列,速度还行,希望大家能够喜欢。
//优先级队列
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();
//优先级队列
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();