python 堆排序

摘要:
#遍历二叉树#不要重复访问二叉树中的所有元素#广度优先遍历#顺序遍历#从第一层开始,每个层从左到右遍历元素#深度优先遍历#假设树的根节点是D,左子树是L,右子树是R,并且L必须在R之前,然后有以下遍历方法:#优先遍历:也称为优先遍历,也称为根优先遍历,DLR#中间顺序遍历:也称中间根遍历,LDR#后续遍历:也称后续根遍历,LRD#遍历序列:遍历树中所有元素一次后获得的元素序列,将层次结构转换为直线

# 二叉树的遍历
# 对二叉树中的所有元素不重复的访问一遍
# 广度优先遍历
# 层序遍历
# 从第一层开始,没一层从左至右遍历元素
# 深度优先遍历
# 假设树的根节点为D,左子树为L,右子树为R,且要求L一定在R之前,则有以下遍历方式:
# 前序遍历:也叫先序遍历,也叫先根遍历,DLR
# 中序遍历:也叫中根遍历,LDR
# 后序遍历:也叫后根遍历,LRD
# 遍历序列:将树中所有元素遍历一遍后,得到的元素的序列,将层次结构转换成了线性结构

# 堆排序
# 堆是一个完全二叉树
# 每个非叶子结点的值都要大于或者等于其左右孩子结点的值,称为大顶堆
# 每个非叶子结点的值都要小于或者等于其左右孩子结点的值,称为小顶堆
# 根结点一定是大顶堆中的最大值,一定是小顶堆中的最小值

# 例子:构建一个完全二叉树(序列 -> 完全二叉树 -> 大顶堆 -> 排序 - > 大顶堆 -> 排序 ...)
# 待排序数字为:30 20 80 40 50 10 60 70 90
# 构建一个完全二叉树存放数据,并根据性质5对元素编号,放入顺序的数据结构中
# 性质5:按层依次编号
# 构建一个列表为[0, 30, 20, 80, 40, 50, 10, 60, 70, 90]***
# 0为补位,因为列表下表从0开始,想从1开始进行使用
# 构建大顶堆的核心算法
# 度数为2的结点A,如果它的左右孩子结点的最大值比它大,将这个最大值和该结点交换
# 度数为1的结点A,如果它的左孩子的值比它大,则交换
# 如果结点A被交换到新的位置,还需要和其孩子结点重复上面的过程
# 构建大顶堆 - 起点结点的选择
# 从完全二叉树的最后一个结点的双亲结点开始,即最后一层的最右边叶子结点的父节点开始***
# 结点数为n,则起始结点的编号n//2(性质5)
# 构建大顶堆 - 下一个结点的选择
# 从起始结点开始向左找其同层结点,到头后再从上一层的最右边结点开始继续向左逐个查找,直到根节点
# 下一结点:n -> n-1 -> n-2 ... 1
# 跟结点计算完毕后,如果有交换,则还需要向下对左右子树进行再次排序
# 大顶堆的目标
# 确保每个结点的值都比左右结点的值大

# 排序
# 将大顶堆根结点这个最大值和最后一个叶子结点交换,那么最后一个叶子结点就是最大值,将这个叶子结点排除在待排序结点外
# 从根结点开始(新的根结点),重新调整为大顶堆后,重复上一步

# 将列表打印成树(堆排序辅助函数)
import math

def printTree(lst):
treeLen = len(lst)
treeLay = math.ceil(math.log2(treeLen + 1)) # 树层数
index = 0
treeWidth = 2 ** treeLay - 1 # 树宽度
for i in range(treeLay):
for j in range(2**i):
print('{:^{}}'.format(lst[index], treeWidth), end=' ')
index += 1
if index >= treeLen:
break
treeWidth = treeWidth//2
print()

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
printTree(lst)

# 调整当前节点
def heap_adjust(n, i, array:list): # array:list 表示array变量的类型是list
'''
调整当前节点核心算放
:param n: 待比较数字的个数
:param i: 当前节点的下标
:param array: 待排序数据
:return:None
'''
while 2 * i <= n: # 性质5,=n只有左子树
# 孩子结点判断2i为左孩子,2i+1为右孩子
lChild_index = 2 * i
maxChild_index = lChild_index # n=2i
if n > lChild_index and array[lChild_index + 1] > array[lChild_index]: # n>2i说明还有右孩子
maxChild_index = lChild_index + 1 # n=2i+1
# 和子树的根节点比较
if array[maxChild_index] > array[i]:
array[i], array[maxChild_index] = array[maxChild_index], array[i] # 交换
i = maxChild_index # 被交换后,需要判断是否还需要调整
else:
break
printTree(array)
print('--------------------------')

# 构建大顶堆
def maxHeap(total, array:list):
for i in range(total//2, 0, -1):
heap_adjust(total, i, array) # 调整当前结点
return array

total = 9
origin = [0,30, 20, 80, 40, 50, 10, 60, 70, 90]
print('maxHeap is ')
printTree(maxHeap(total, origin))

# 结论:第一层是最大值,第二层一定有个次大值




免责声明:文章转载自《python 堆排序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇修改pycharm中的flask项目名遇到的坑.net 操作 excel下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

原生redis命令

一、 redis-cli 连接 redis 进入redis安装目录 cd /usr/local/bin 进入redis客户端 ./redis-cli -p 6379 -h 用于指定 ip -p 用于指定端口 -a 用于指定认证密码 退出客户端 quit 指定 database,默认16个数据库 select 3   二、 redis-cli 操作 redi...

算法总结—深度优先搜索DFS

深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈)。 深度优先从最开始的状态出发,遍历所有可以到达的状态。由此可以对所有的状态进行操作,或列举出所有的状态。 1.poj2386 Lake Couting 题意:八连通被认为连接在一起,求总共有多少个水洼? Sample Input: 10 12 W........WW. .WWW.....WWW...

React之JSX循环遍历方法对比

JSX支持遍历语法,如下 除了上面数组遍历方式,还有另一种,如下所示 结合for循环(外部) 注意: 主流循环写法是 map,jsx里面不能用for循环,因为for循环不是表达式。可以用Array::map方法,注意给返回的每一个组件设置一个唯一的key。 ....

在Python中运行gmssl

目录 在Python中运行gmssl Python版本 gmssl介绍 安装gmssl包 基于gmssl的SM2、3、4算法实现 SM2算法 SM3算法 SM4算法 在Python中运行gmssl Python版本 Python 3.8.1 gmssl介绍 ​ GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等...

B树、B+树

B树 B树是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(logn)的时间复杂度进行查找、顺序读取、插入和删除等操作。 B树的特性 B树中允许一个结点中包含多个key,可以是3个、4个、5个甚至更多,并不确定,需要看具体的实现。现在我们选 择一个参数M,来构造一个B树,我们可以把它称作是M阶的B树,那么该树会具有如下特点: 每个结点最多有M-...

[转] DataSet的的几种遍历

[转] DataSet的的几种遍历  1. 多表多行多列的情况 foreach (DataTable dt in YourDataset.Tables)                      //遍历所有的datatable {   foreach (DataRow dr in dt.Rows)        ...