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中for循环详解
Jan 17 Python
介绍Python中的一些高级编程技巧
Apr 02 Python
对pandas中Series的map函数详解
Jul 25 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
手写一个python迭代器过程详解
Aug 27 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
python实现飞船游戏的纵向移动
Apr 24 Python
如何基于python把文字图片写入word文档
Jul 31 Python
python map比for循环快在哪
Sep 21 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
Python办公自动化之Excel(中)
May 24 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入门的学习方法
2007/01/02 PHP
PHP时间戳使用实例代码
2008/06/07 PHP
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
CI(CodeIgniter)框架介绍
2014/06/09 PHP
PHP队列用法实例
2014/11/05 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
2017/10/20 jQuery
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
python实现linux下使用xcopy的方法
2015/06/28 Python
python实现八大排序算法(2)
2017/09/14 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
销售文员岗位职责
2013/11/29 职场文书
领导干部培训感言
2014/01/23 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
泰山导游词
2015/02/02 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
安全教育培训制度
2015/08/06 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
只用20行Python代码实现屏幕录制功能
2021/06/02 Python