思路:

1.建立堆

2.得到堆顶元素,为最大元素

3.去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。

4.堆顶元素为第二大元素。

5.重复步骤3,直到堆变空。

动画

代码:

def sift(data, low, high):
i = low # 父节点
j = * i + # 左子节点
tmp = data[i] # 父节点值
while j <= high: # 子节点在节点中
if j < high and data[j] > data[j + ]: # 有右子节点且右节点比父节点值大
j +=
if tmp > data[j]:
data[i] = data[j] # 将父节点替换成新的子节点的值
i = j # 变成新的父节点
j = * i + # 新的子节点
else:
break
data[i] = tmp # 将替换的父节点值赋给最终的父节点 def heap_sort(data):
n = len(data)
# 创建堆
for i in range(n//2-1, -1, -1):
sift(data, i, n-) # 挨个出数
for i in range(n-, -, -): # 从大到小
data[], data[i] = data[i], data[] # 将最后一个值与父节点交互位置
sift(data, , i-) li = list(range())
random.shuffle(li)
print(li)
heap_sort(li)
print(li)

实例:

将列表内的数据以id的值从小到大排序

def random_list(n):
'''
生成随机数据
:param n:
:return:
'''
ret = []
a1 = ['赵', '钱', '孙', '李', '邹', '吴', '郑', '王', '周']
a2 = ['力', '好', '礼', '丽', '文', '建', '梅', '美', '高', '']
a3 = ['强', '文', '斌', '阔', '文', '莹', '超', '云', '龙', '']
ids = range(, + n)
for i in range(n):
name = random.choice(a1) + random.choice(a2) + random.choice(a3)
age = random.randint(, )
dic = {'id': ids[i], 'name': name, 'age': age}
ret.append(dic)
return ret def sift(data, low, high):
i = low # 父节点
j = * i + # 左子节点
tmp = data[i] # 父节点值
while j <= high: # 子节点在节点中
if j < high and data[j]['id'] < data[j + ]['id']: # 有右子节点且右节点比父节点值大
j +=
if tmp['id'] < data[j]['id']:
data[i] = data[j] # 将父节点替换成新的子节点的值
i = j # 变成新的父节点
j = * i + # 新的子节点
else:
break
data[i] = tmp # 将替换的父节点值赋给最终的父节点 def heap_sort(data):
n = len(data)
# 创建堆
for i in range(n//2-1, -1, -1):
sift(data, i, n-) # 挨个出数
for i in range(n-, -, -): # 从大到小
data[], data[i] = data[i], data[] # 将最后一个值与父节点交互位置
sift(data, , i-) li = random_list() # 生成数据
random.shuffle(li) # 将数据打乱
heap_sort(li)
print(li)

python3 堆排序的更多相关文章

  1. [151225] Python3 实现最大堆、堆排序,解决TopK问题

    参考资料: 1.算法导论,第6章,堆排序 堆排序学习笔记及堆排序算法的python实现 - 51CTO博客 堆排序 Heap Sort - cnblogs 小根堆实现优先队列:Python实现 -cn ...

  2. Python3标准库:heapq堆排序算法

    1. heapq堆排序算法 堆(heap)是一个树形数据结构,其中子节点与父节点有一种有序关系.二叉堆(binary heap)可以使用一个有组织的列表或数组表示,其中元素N的子元素位于2*N+1和2 ...

  3. 3.Python3标准库--数据结构

    (一)enum:枚举类型 import enum ''' enum模块定义了一个提供迭代和比较功能的枚举类型.可以用这个为值创建明确定义的符号,而不是使用字面量整数或字符串 ''' 1.创建枚举 im ...

  4. 算法导论 第六章 堆排序(python)

    6.1堆 卫星数据:一个带排序的的数通常是有一个称为记录的数据集组成的,每一个记录有一个关键字key,记录的其他数据称为卫星数据. 原地排序:在排序输入数组时,只有常数个元素被存放到数组以外的空间中去 ...

  5. 十大排序算法总结(Python3实现)

    十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...

  6. Python3 实例

    一直以来,总想写些什么,但不知从何处落笔. 今儿个仓促,也不知道怎么写,就把手里练习过的例子,整理了一下. 希望对初学者有用,都是非常基础的例子,很适合初练. 好了,Follow me. 一.Pyth ...

  7. python3中的heapq模块使用

    heapq-堆排序算法 heapq实现了一个适合与Python的列表一起使用的最小堆排序算法. 二叉树 树中每个节点至多有两个子节点 满二叉树 树中除了叶子节点,每个节点都有两个子节点 什么是完全二叉 ...

  8. python3实现几种常见的排序算法

    python3实现几种常见的排序算法 冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  9. 从头造轮子:python3 asyncio之 sleep (4)

    前言 书接上文:,本文造第四个轮子,也是asyncio包里面非常常用,并且非常复杂的一个函数sleep 一.知识准备 ● time.sleep直接让当前线程睡觉,但是这种方式显然是不能接受的,如果当前 ...

随机推荐

  1. fetch body里数据为ReadableStream 解决办法

    前端工程中发送 HTTP 请求从来都不是一件容易的事,前有骇人的 ActiveXObject ,后有 API 设计十分别扭的 XMLHttpRequest ,甚至这些原生 API 的用法至今仍是很多大 ...

  2. live555笔记_hi3516A

    1.简介 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SI ...

  3. 【c++ primer, 5e】特殊用途语言特性

    [默认实参] 1.注意点:函数的默认实参可以在函数的声明中添加,但是后续声明只能添加默认参数而不能改变先前声明的默认参数.(函数的声明通常是定义在头文件上的,多次声明同一个函数是合法的) 2.默认实参 ...

  4. python 数据分析----numpy

    NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环对整组数据进行快速运算的数学函数 ...

  5. thrift使用上面的一些坑

    https://blog.csdn.net/andylau00j/article/details/53912485

  6. 重新想,重新看——CSS3变形,过渡与动画①

    学习CSS3,觉得最难记忆的部分除了flex特性之外,就要属变形,过渡和动画部分了.作为初学者,总有种犯懒的心理,想着既然IE8浏览器都不完全支持CSS动画属性,还要考虑浏览器兼容问题,那么就不那么着 ...

  7. PHP设计模式(二):工厂方法模式

  8. storm(二) 事务机制

    前言 为了保证tuple的强有序和exactly-once语义,storm提供了事务机制,为每个tuple提供一个id 设计方法1 为每个tuple设置一个事务id,在数据库保存事务id和当前处理的i ...

  9. 6.scala中的包

    版权申明:转载请注明出处. 文章来源:http://bigdataer.net/?p=287 排版乱?请移步原文获得更好的阅读体验 1.基础特性 scala中的包和java中的包类似,都是用来在大型工 ...

  10. mac iterm2 打开Linux 服务器文件乱码

    我的mac 上用是iterm2终端, Shell 环境是zsh.ssh 到Linux 服务器上查看一些文件时,中文乱码. 这种情况一般是终端和服务器的字符集不匹配,MacOSX下默认的是utf8字符集 ...