NB二人组(一)----堆排序
堆排序前传--树与二叉树简介

特殊且常用的树--二叉树

两种特殊的二叉树

二叉树的存储方式

二叉树小结

堆排序


堆这个玩意.......


堆排序过程:

构造堆:

堆排序的算法程序(程序需配合着下图理解):


def sift(data,low,high): # 调整函数
i = low # 树的根 也就是父亲 ,这里只领导
j = 2 * i + 1 # 根的左孩子 也就是 儿子 ,这里指小领导
tmp = data[i] # 把根 取出来 做调整 , 在这里 领导
while j <= high: # high其实就是 根的右儿子(也就是最后一个儿子),如果 j= high 则表示没有右儿子,也就是说这里必须有儿子在
if j < high and data[j] < data[j + 1]: # j < high 代表有右儿子 , data[j] < data[j + 1] 说明右儿子比左儿子大
j += 1 # 这个 j 则变为右儿子 ,也就是 若有比 j 大的值,则 j 就变为比他大的那个值
if tmp < data[j]: # 如果领导不能干
data[i] = data[j] # 则小领导上位
i = j # 小领导变为大领导
j = 2 * i + 1 # 小小领导变为小领导
else: # 如果领导能干
break # 那就待着吧
data[i] = tmp # 到最后 i 这里肯定会有空位 ,所以无论 tem 是谁 都要占住这个空位 # 方法一
def heap_sort(data): # 开始进行堆排序
n = len(data) # n 为长度
# 开始建堆
for i in range(n // 2 - 1,-1,-1): # n//2-1为图片中的 5 的位置,-1 为到0 结束 ,-1 为步长
sift(data,i,n-1) # i 为low也就是其父节点,n-1 为high 也就是堆的最后 ,也就是每次调整小领导所在的堆
# 堆建好了
# 升序排列
for i in range(n-1,-1,-1): # n-1为high 也就是从堆得最后 一直到 0为止,也就是从刁民到领导
data[0],data[i]=data[i],data[0] # 堆的顶部 和 堆的末尾 互换, 也就是领导退休,刁民上位
sift(data,0,i-1) # 0 代表着领导 ,i-1 代表着这个堆的位置不能把领导算在内了,也就是领导退休了,把他赶出这个城市了
# 降序排列,耗内存 # 方法二 耗内存
# def heap_sort(data): # 开始进行堆排序
# n = len(data) # n 为长度
# # 开始建堆
# for i in range(n // 2 - 1, -1, -1): # n//2-1为图片中的 5 的位置,-1 为到0 结束 ,-1 为步长
# sift(data, i, n - 1) # i 为low也就是其父节点,n-1 为high 也就是堆的最后 ,也就是每次调整小领导所在的堆
# # 堆建好了
# # 降序排列
# li=[] # 监狱
# for i in range(n-1,-1,-1):
# li.append(data[0]) # 领导进监狱了
# data[i] = data[0] # 领导下位了
# sift(data,0,i-1) # 领导离开了城市 , 进监狱了
堆的应用


☆☆☆☆堆模块库地址(点击这行字)☆☆☆☆

利用堆模块来进行演算
import heapq # 堆模块
heap = []
data = list(range(10000))
random.shuffle(data)
for i in data:
heapq.heappush(heap,i)
for i in range(len(heap)):
print(heapq.heappop(heap)) print(heapq.nlargest(10,data)) # 堆模块 从大到小 排序 只取前十个数
print(heapq.nsmallest(10,data)) # 堆模块 从小到大 排序 只取前十个数
程序演示:

`
`
`


NB二人组(一)----堆排序的更多相关文章
- 算法 排序NB二人组 堆排序 归并排序
		
参考博客:基于python的七种经典排序算法 常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储 ...
 - low逼三人组、nb二人组、归并、希尔排序----小结
 - NB二人组(二)----归并排序
		
归并排序的思路: 归并算法程序(配合下图进行思考): def merge(li,low,mid,high): i = low j = mid + 1 ltmp=[] while i <= mid ...
 - 列表排序之NB三人组附加一个希尔排序
		
NB三人组之 快速排序 def partition(li, left, right): tmp = li[left] while left < right: while left < ri ...
 - 排序NB三人组
		
排序NB三人组 快速排序,堆排序,归并排序 1.快速排序 方法其实很简单:分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”.先从右往左找一个小于6的数,再从左往 ...
 - 算法排序-NB三人组
		
快速排序: 堆排序: 二叉树: 两种特殊二叉树: 二叉树的存储方式: 小结: 堆排序正题: 向下调整: 堆排序过程: 堆排序-内置模块: 扩展问题topk: 归并排序: 怎么使用: NB三人组小结
 - 排序算法之NB三人组
		
快速排序 思路: 例如:一个列表[5,7,4,6,3,1,2,9,8], 1.首先取第一个元素5,以某种方式使元素5归位,此时列表被分为两个部分,左边的部分都比5小,右边的部分都比5大,这时列表变成了 ...
 - Binary Heap(二叉堆) - 堆排序
		
这篇的主题主要是Heapsort(堆排序),下一篇ADT数据结构随笔再谈谈 - 优先队列(堆). 首先,我们先来了解一点与堆相关的东西.堆可以实现优先队列(Priority Queue),看到队列,我 ...
 - 牛B三人组-快速排序-堆排序-归并排序
		
快速排序 随便取个数,作为标志值,这里就默认为索引位置为0的值 记录左索引和右索引,从右往左找比标志值小的,小值和左索引值交换,右索引变化,然后从左往右找比标志值大的,大值和右索引值交换,左索引变化 ...
 
随机推荐
- php PDO操作类
			
<?php /*//pdo连接信息 $pdo=array("mysql:host=localhost;dbname=demo;charset=utf8","root ...
 - JSON和Django内置序列化
			
JSON 什么是JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * J ...
 - 转---秒杀多线程第八篇 经典线程同步 信号量Semaphore
			
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
 - openstack的网络配置
			
首先在浏览器输入咱们的控制节点的ip地址登陆horizon,也就是dashboard控制页面 输入好用户名与密码,这时输入的用户名与密码会与我们的老大哥keystone进行认证.确认你输入的这个用户有 ...
 - [十四]SpringBoot 之 Spring拦截器(HandlerInterceptor)
			
过滤器属于Servlet范畴的API,与spring 没什么关系. Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截 ...
 - QT样式表
			
QT样式表 一.QT样式表简介 1.QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离,使得设计皮肤与界面控件分离的软件成为可能. QT样式表是允许用户定制widgets组件外观的强大机制 ...
 - oracle 插入单引号
			
INSERT INTO tb (id) values ('hellp'||''''||'张三') --等于 hellp'张三
 - Splitter Control for Dialog
			
原文链接地址:https://www.codeproject.com/Articles/595602/Splitter-Control-for-Dialog Introduction Yes, tha ...
 - KMP算法复习【+继续学习】
			
离NOIP还剩12天,本蒟蒻开始准备复习了. 先来个KMP[似乎我并没有写过KMP的blog] KMP KMP算法是解决字符串匹配问题的一个算法,主要是单对单的字符串匹配加速,时间复杂度O(m + n ...
 - git 撤销上一次 commit
			
1.本地 commit,没有推到远程仓库 可以 git reset --soft <commit_id>,commit_id 是要回退到的某一版本 然后再进行修改,再commit, 如果需 ...