python堆排序求topn_python实现最小堆(TOP N 问题)

top N问题可以使用最小堆来实现

一下程序实现了从用户输入的一系列数字中,选出最大的N个数字(不是堆排序)

#!/usr/bin/env python

#coding=utf-8

#heapsort.py

import sys

import stdinInput

def heapsort(sortarray,topN):

sortarraylen=len(sortarray)

heaparray=[]

for i in xrange(0,sortarraylen):

if len(heaparray)<=topN:

heaparray.append(sortarray[i])

heapinsertadjust(heaparray,i)

else:

if sortarray[i]>heaparray[0]:

heaparray[0]=sortarray[i]

heapdeleteadjust(heaparray,0)

return heaparray

#调整初始最小堆

def heapinsertadjust(sortarray,beginnode):

rootnode=beginnode;

while(rootnode>0):

parentNode=(rootnode-1)/2

if sortarray[rootnode]

sortarray[rootnode],sortarray[parentNode]=sortarray[parentNode],sortarray[rootnode]

rootnode=parentNode

#最小堆构造完成后,再来满足条件的数据就需要删除掉节点

def heapdeleteadjust(sortarray,nodeid):

currentminid=nodeid

sortarraylen=len(sortarray)

if (nodeid*2+1)>=sortarraylen:

return;

if (nodeid*2+2)

currentminid=currentminid*2+1 if sortarray[currentminid*2+1]

currentminid=nodeid*2+2 if sortarray[nodeid*2+2]

if currentminid!=nodeid:

sortarray[currentminid],sortarray[nodeid]=sortarray[nodeid],sortarray[currentminid]

heapdeleteadjust(sortarray,currentminid)

else:

return

else:

if sortarray[currentminid*2+1]

sortarray[currentminid*2+1],sortarray[currentminid] = sortarray[currentminid],sortarray[currentminid*2+1]

return

if __name__=='__main__':

style=5

try:

style=int(sys.argv[1])

except:

print "input argv error, use 5 as Number of bottom"

stdinInput.stdinInput()

intsortArrays=heapsort(stdinInput.intsortArrays,style)

print intsortArrays

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值