思路:

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)

最新文章

  1. spring源码分析之freemarker整合
  2. 修改 C:\Users\[account name] 目录名称
  3. Wechat4j之Hello world——使用wechat4j快速开发java版微信公众号
  4. Mysql-函数coalesce-查询为空设置默认值
  5. Linux的ldconfig和ldd用法
  6. hdu-----(4514)湫湫系列故事——设计风景线(树形DP+并查集)
  7. CSS绘制无图片的气泡对话框
  8. Myeclipse10、Maven构建Javaweb项目
  9. iOS开发实战-时光记账Demo 网络版
  10. Python2中文处理纪要
  11. JDK环境配置(Windows)
  12. CentOS 7 FTP环境部署
  13. 阿里云yum配置
  14. 基于pygame实现飞机大战【面向过程】
  15. 从函数式编程到Ramda函数库(一)
  16. C++ code:for loop designs
  17. window10总提示幸福倒计时,解决方法
  18. mybatis 插入空值时报错 TypeException
  19. day 53 练习
  20. JIRA服务器搭建

热门文章

  1. 如何禁止ping
  2. Python3.x:报错POST data should be bytes, an iterable of bytes
  3. 《Java程序设计》 第2周学习总结
  4. 20145335郝昊《java程序设计》第2次实验报告
  5. Objective-C 集成农行支付接口
  6. ImportError: No module named Crypto.PublicKey
  7. winlog
  8. pagehelper的使用
  9. CentOS 7 Firewalld 常用操作
  10. 【Network Architecture】SegNet论文解析(转)