Python实现的堆排序算法示例


Posted in Python onApril 29, 2018

本文实例讲述了Python实现的堆排序算法。分享给大家供大家参考,具体如下:

堆排序的思想: 堆是一种数据结构,可以将堆看作一棵完全二叉树,这棵二叉树满足,任何一个非叶节点的值都不大于(或不小于)其左右孩子节点的值。 将一个无序序列调整为一个堆,就可以找出这个序列的最大值(或最小值),然后将找出的这个值交换到序列的最后一个,这样有序序列就元素就增加一个,无序序列元素就减少一个,对新的无序序列重复这样的操作,就实现了排序。

堆排序的执行过程:

1.从无序序列所确定的完全二叉树的第一个非叶子节点开始,从右至左,从下至上,对每个节点进行调整,最终将得到一个大顶堆。

对节点的调整方法:将当前节点(假设为a)的值与其孩子节点进行比较,如果存在大于a的值的孩子节点,则从中选出最大的一个与a交换。当a来到下一层的时候重复上述过程,直到a的孩子节点的值都小于a为止

2.将当前无序序列中的第一个元素(反映在数中是根节点b),与无序序列中的最后一个元素交换(假设为c),b进入有序序列,到达最终位置。无序序列元素减少1个,有序序列元素增加1个,此时只有节点c可能不满足堆的定义,对其进行调整。

3.重复2 的过程,直到无序序列的元素剩下一个时排序结束。

Python实现的堆排序算法示例

# -*- coding:utf-8 -*-
# 堆排序适用于记录数很多的情况
from collections import deque
# 这里需要说明元素的存储必须要从1开始
# 涉及到左右节点的定位,和堆排序开始调整节点的定位
# 在下标0处插入0,它不参与排序
L = deque([49,38,65,97,76,13,27,49])
L.appendleft(0)
#L = [0,49,38,65,97,76,13,27,49]
def element_exchange(numbers,low,high):
  temp = numbers[low]
  # j 是low的左孩子节点(cheer!)
  i = low
  j = 2*i
  while j<=high:
    # 如果右节点较大,则把j指向右节点
    if j<high and numbers[j]<numbers[j+1]:
      j = j+1
    if temp<numbers[j]:
      # 将numbers[j]调整到双亲节点的位置上
      numbers[i] = numbers[j]
      i = j
      j = 2*i
    else:
      break
  # 被调整节点放入最终位置
  numbers[i] = temp
def top_heap_sort(numbers):
  length = len(numbers)-1
  # 指定第一个进行调整的元素的下标
  # 它即该无序序列完全二叉树的第一个非叶子节点
  # 它之前的元素均要进行调整
  # cheer up!
  first_exchange_element = length/2
  #建立初始堆
  print first_exchange_element
  for x in range(first_exchange_element):
    element_exchange(numbers,first_exchange_element-x,length)
  # 将根节点放到最终位置,剩余无序序列继续堆排序
  # length-1 次循环完成堆排序
  for y in range(length-1):
    temp = numbers[1]
    numbers[1] = numbers[length-y]
    numbers[length-y] = temp
    element_exchange(numbers,1,length-y-1)
if __name__=='__main__':
  top_heap_sort(L)
  for x in range(1,len(L)):
    print L[x],

运行结果:

Python实现的堆排序算法示例

Python 相关文章推荐
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
Feb 28 Python
Ubuntu18.04下python版本完美切换的解决方法
Jun 14 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
Python flask框架实现浏览器点击自定义跳转页面
Jun 04 Python
Python结合百度语音识别实现实时翻译软件的实现
Jan 18 Python
python中if嵌套命令实例讲解
Feb 25 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 #Python
分享一下Python数据分析常用的8款工具
Apr 29 #Python
Python随机函数random()使用方法小结
Apr 29 #Python
Python中py文件引用另一个py文件变量的方法
Apr 29 #Python
python实现类之间的方法互相调用
Apr 29 #Python
Python装饰器原理与简单用法实例分析
Apr 29 #Python
Python2.7 实现引入自己写的类方法
Apr 29 #Python
You might like
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
php实现计数器方法小结
2015/01/05 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
Js基础学习资料
2010/11/23 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
Jquery获取radio选中值实例总结
2019/01/17 jQuery
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
用JS实现选项卡
2020/03/23 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
python之Character string(实例讲解)
2017/09/25 Python
python读取文件名并改名字的实例
2019/01/07 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
幼儿园教师辞职信
2014/01/18 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
小学网上祭英烈活动总结
2014/07/05 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书