备战蓝桥杯Day21 - 堆排序的内置模块+topk问题

一、内置模块

在python中,堆排序已经设置好了内置模块,不想自己写的话可以使用内置模块,真的很方便,但是堆排序算法的底层逻辑最好还是要了解并掌握一下的。

使用heapq模块的heapify()函数将列表转换为堆,然后使用heappop()heappush()函数执行堆排序操作。

代码实现

import heapq  # 导入包
import random   # 随机数库,生成随机数li = list(range(100))
random.shuffle(li)print(li)
heapq.heapify(li)   # 建堆的过程# 使用内置模块实现堆排序
n = len(li)
for i in range(n):print(heapq.heappop(li), end=",")

二、topk问题 

问题描述:现在有n个数,设计算法得到前k个大的数。(k<n)

解决思路:

        取列表前k个元素建立一个小根堆。堆顶就是目前第k大的数。

        依次向后遍历原列表,对于列表中的元素,如果小于堆顶,则忽略该元素;如果大于堆顶,则将堆顶更换为该元素,并且对堆顶进行一次调整。

        遍历列表所有元素后,倒序弹出堆顶。

代码实现:

def sift(li, low, high):""":param li: 用列表存放树结构:param low: 堆的根节点位置:param high: 堆的最后一个元素的位置:return:"""i = low   # i最开始指向根节点j = 2 * i + 1   # j最开始指向左孩子tmp = li[low]   # 将栈顶保存起来while j <= high:  # 循环条件为只要j不越过列表的界if j + 1 <= high and li[j+1] < li[j]:  j = j+1    # 那么把指针指向数字大的右孩子if li[j] < tmp:li[i] = li[j]   # 将i位置赋值为较大的数i = j   # 并将i,j指针向下移动j = 2 * i +1else:  # 如果tmp更大,将tmp放到i的位置上li[i] = tmp   # 把tmp放到某个子树的根节点上breakelse:li[i] = tmp   # 把tmp放到叶子节点上def topk(li, k):heap = li[0:k]# 1.建堆for i in range((k-2)//2, -1, -1):sift(heap, i, k-1)# 2.遍历并向下调整for i in range(k, len(li)-1):if li[i] > heap[0]:heap[0] = li[i]   #sift(heap, 0, k-1)# 3.出数for i in range(k-1,-1, -1):heap[0], heap[i] = heap[i], heap[0]sift(heap, 0, i-1)return heap# 测试例子
import random
li = list(range(1000))
random.shuffle(li)
print(topk(li, 10))

运行结果

三、学习碎碎念 

三天!我终于把这个堆排序看完了!只是看完了,还没有真正的理解会运用。三月的第一天,新的一个月继续加油!每天的课老多,还要抽出空来自己学习,真的是超级累啊,慢慢来吧,总会熬过去的!

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/502627.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Highest Price in Supply Chain (25)

1、题目&#xff1a; A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting …

Spring MVC 和 Spring Cloud Gateway不兼容性问题

当启动SpringCloudGateway网关服务的时候&#xff0c;没注意好依赖问题&#xff0c;出现了这个问题&#xff1a; Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway. 解决办法就是&#xff1a;删除SpringMVC的依赖&#xff0c;即下列依赖。 &…

蓝桥杯练习系统(算法训练)ALGO-996 车的放置

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 在一个n*n的棋盘中&#xff0c;每个格子中至多放置一个车&#xff0c;且要保证任何两个车都不能相互攻击&#xff0c;有多少…

深入探究Python多进程编程:Multiprocessing模块基础与实战【第98篇—Multiprocessing模块】

深入探究Python多进程编程&#xff1a;Multiprocessing模块基础与实战 在Python编程中&#xff0c;多进程处理是一项关键的技术&#xff0c;特别是在需要处理大规模数据或执行耗时任务时。为了充分利用多核处理器的优势&#xff0c;Python提供了multiprocessing模块&#xff0…

MYSQL02高级_目录结构、默认数据库、表文件、系统独立表空间

文章目录 ①. MySQL目录结构②. 查看默认数据库③. MYSQL5.7和8表文件③. 系统、独立表空间 ①. MySQL目录结构 ①. 如何查看关联mysql目录 [rootmysql8 ~]# find / -name mysql /var/lib/mysql /var/lib/mysql/mysql /etc/selinux/targeted/tmp/modules/100/mysql /etc/seli…

2024年新提出的算法|LEA爱情进化算法(Love Evolution Algorithm)

Love Evolution Algorithm: a stimulus–value–role theory-inspired evolutionary algorithm for global optimization 爱情进化算法Love Evolution Algorithm&#xff0c;LEA&#xff0c;于2024年2月发表在中科院3区SCI期刊 The Journal of Supercomputing。 1、简介 本文提…

13.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-如果没有工具就创造工具

内容参考于&#xff1a; 易道云信息技术研究院VIP课 上一个内容 &#xff1a;12.游戏网络通信存在的问题 现在把游戏网络的架构看了一个小小的大概&#xff0c;可以用它的接口发数据接收数据了&#xff0c;如果真正想用它这一套东西&#xff0c;真正核心不在于它的接口而在于…

(介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)

前言 本文详细介绍了如何利用物联网技术,通过NodeMCU ESP8266(ESP-12F)模块连接到新版的OneNet平台,使用MQTT协议实现数据的上传与指令的下发。文中首先对NodeMCU ESP8266模块及其特性进行了简介,随后详细阐述了如何配置和使用MQTT协议连接到OneNet平台,实现温湿度数据的…

华宽通招商合同履约管理系统:全流程把控,引领招商引资新篇章

在当今高速发展的经济时代&#xff0c;招商活动已成为推动产业园区发展的重要引擎。然而面对复杂多变的市场环境&#xff0c;传统的招商方式已无法满足现代产业园区的高效管理需求。华宽通招商合同履约管理系统应运而生&#xff0c;旨在通过科技手段&#xff0c;为招商引资提供…

外包干了7个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入北京某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Qt应用软件【测试篇】vargrid内存检查工具

文章目录 vargrid介绍vargrid官网vargrid安装常用命令Valgrind的主要命令vargrid介绍 Valgrind是一个用于构建动态分析工具的框架,能自动检测许多内存管理和线程错误,并详细分析程序性能。Valgrind发行版包括七个成熟工具:内存错误检测器、两个线程错误检测器、缓存和分支预…

数通HCIE和云计算HCIE哪个好一点?

数通是网络的基础知识&#xff0c;也是入门人员必学的方向&#xff0c;相对也会简单些&#xff0c;学习数通&#xff0c;可以很好的学习其他的方向。数通的就业范围也比较广&#xff0c;运营商、企业、政府还是互联网公司&#xff0c;都需要大量的数通工程师来搭建和维护网络&a…