堆排序前传--树与二叉树简介

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

两种特殊的二叉树

二叉树的存储方式

二叉树小结

堆排序

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

堆排序过程:

构造堆:

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

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二人组(一)----堆排序的更多相关文章

  1. 算法 排序NB二人组 堆排序 归并排序

    参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储 ...

  2. low逼三人组、nb二人组、归并、希尔排序----小结

  3. NB二人组(二)----归并排序

    归并排序的思路: 归并算法程序(配合下图进行思考): def merge(li,low,mid,high): i = low j = mid + 1 ltmp=[] while i <= mid ...

  4. 列表排序之NB三人组附加一个希尔排序

    NB三人组之 快速排序 def partition(li, left, right): tmp = li[left] while left < right: while left < ri ...

  5. 排序NB三人组

    排序NB三人组 快速排序,堆排序,归并排序 1.快速排序 方法其实很简单:分别从初始序列“6  1  2 7  9  3  4  5 10  8”两端开始“探测”.先从右往左找一个小于6的数,再从左往 ...

  6. 算法排序-NB三人组

    快速排序: 堆排序: 二叉树: 两种特殊二叉树: 二叉树的存储方式: 小结: 堆排序正题: 向下调整: 堆排序过程: 堆排序-内置模块: 扩展问题topk: 归并排序: 怎么使用: NB三人组小结

  7. 排序算法之NB三人组

    快速排序 思路: 例如:一个列表[5,7,4,6,3,1,2,9,8], 1.首先取第一个元素5,以某种方式使元素5归位,此时列表被分为两个部分,左边的部分都比5小,右边的部分都比5大,这时列表变成了 ...

  8. Binary Heap(二叉堆) - 堆排序

    这篇的主题主要是Heapsort(堆排序),下一篇ADT数据结构随笔再谈谈 - 优先队列(堆). 首先,我们先来了解一点与堆相关的东西.堆可以实现优先队列(Priority Queue),看到队列,我 ...

  9. 牛B三人组-快速排序-堆排序-归并排序

    快速排序 随便取个数,作为标志值,这里就默认为索引位置为0的值 记录左索引和右索引,从右往左找比标志值小的,小值和左索引值交换,右索引变化,然后从左往右找比标志值大的,大值和右索引值交换,左索引变化 ...

随机推荐

  1. 规则引擎之easyRules

    规则引擎听起来是蛮高深的一个词语,但透过现象看本质,Martin Fowler 有如下言: You can build a simple rules engine yourself. All you ...

  2. Linux下objdump查看C程序编译后的汇编代码

    http://m.blog.csdn.net/article/details?id=47747047 Uboot中start.S源码的指令级的详尽解析 http://www.crifan.com/fi ...

  3. SQL的拼接语句在DELPHI中怎么写

    SQL 语句的拼接,关键点在于对引号的处理上. 在 delphi 的语法中,使用单引号做字符串的标志符.因此,当遇到 SQL 语句中字符串标识量编写的时候,需要用两个单引号来代替实际的引号. 举例: ...

  4. 堆模板(pascal)洛谷P3378

    题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: ...

  5. shell脚本学习—正则表达式

    正则表达式概念.特点 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤辑. 给定一个 ...

  6. BZOJ5091 摘苹果(概率期望)

    大胆猜想每一步都相当于是第一步.稍微验证一下发现是对的.就做完了. #include<iostream> #include<cstdio> #include<cmath& ...

  7. castle activerecord 学习过程出现的问题

    优点: 1.CRUD:代码简洁 2.不用配置map 3.自带事务方便 4.自带IOC 5.自带 数据有效性验证 缺点: 1.自增长(Oracle 一直提示序号不存在,有空继续尝试) 2.多条件,直接用 ...

  8. 使用Hexo写博客

    首先,你需要搭建一个Hexo博客网站- 使用Hexo搭建GitHub博客(2018年Mac版) 原生方式新建文章 Hexo的项目结构是在网站根目录的source/_posts目录下存放你的博客文档,以 ...

  9. Mybatis中jdbcType和javaType对应关系

    Mybatis中javaType和jdbcType对应关系 JDBC Type           Java Type CHAR                String VARCHAR       ...

  10. UVA-1635 数学

    UVA-1635 题意: 给定n个数a1,a2,a3.....an,依次求出相邻的两个数的和,最后成为一个数,问这个数模m的值与那些最初的数无关 例:a1,a2,a3, m=2 => a1+a2 ...