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实现数通设备tftp备份配置文件示例
Apr 02 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
Python语言描述连续子数组的最大和
Jan 04 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
python使用__slots__让你的代码更加节省内存
Sep 05 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
Python实现微信小程序支付功能
Jul 25 Python
使用Python为中秋节绘制一块美味的月饼
Sep 11 Python
Pycharm安装python库的方法
Nov 24 Python
Opencv+Python识别PCB板图片的步骤
Jan 07 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 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
CI框架中cookie的操作方法分析
2014/12/12 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
Python中使用中文的方法
2011/02/19 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
构建Python包的五个简单准则简介
2015/06/15 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
Python和Bash结合在一起的方法
2020/11/13 Python
C++:局部变量能否和全局变量重名
2014/03/03 面试题
Linux中如何用命令创建目录
2016/12/02 面试题
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
市场营销管理毕业生自荐信
2014/03/03 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
供电工程专业求职信
2014/08/09 职场文书
javascript实现计算器功能详解流程
2021/11/01 Javascript
MYSQL 表的全面总结
2021/11/11 MySQL