编程题目: 找出最小的k个数

找出最小或者最大的几个数我使用的是堆排序,效率为0(nlgn)


构建小顶堆返回末尾的k个数 或者 构建大顶堆返回前k个数

 

 1 #!/usr/bin/env python3
 2 
 3 def heap_sort(ary, num):
 4         def siftdown(ary, e, begin, end):
 5                 i,j = begin, begin*2+1
 6                 while j < end:
 7                         if j+1 < end and ary[j+1] < ary[j]:
 8                                 j += 1
 9                         if e < ary[j]:
10                                 break
11                         ary[i] = ary[j]
12                         i,j = j,j*2+1
13                 ary[i] = e
14 
15         end = len(ary)
16         for i in range(end//2-1, -1, -1):
17                 siftdown(ary, ary[i], i, end)
18 
19         #方法1
20         for i in range(end-1, -1, -1):
21                 e = ary[i]
22                 ary[i] = ary[0]
23                 siftdown(ary, e, 0, i)
24         return ary[:-num-1:-1]
25 
26         #方法2
27         """
28         li = []
29         for i in range(num):
30                 if len(ary) > i:
31                         li.append(ary[0])
32                         e = ary[end-1-i]
33                         siftdown(ary, e, 0, end-1-i)
34                 else:
35                         break
36         return li       
37         """
38 
39 if __name__ == '__main__':
40         a = [4,5,1,6,2,7,3,8]
41         num = int(input("最小的k个数:"))
42         print(heap_sort(a,num))

 

转载于:https://www.cnblogs.com/xautxuqiang/p/6434785.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值