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 相关文章推荐
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
Python内置函数delattr的具体用法
Nov 23 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
Aug 03 Python
Python中Proxypool库的安装与配置
Oct 19 Python
对python:threading.Thread类的使用方法详解
Jan 31 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
python的json包位置及用法总结
Jun 21 Python
python实现银行账户系统
Feb 22 Python
python 破解加密zip文件的密码
Apr 22 Python
Python实现日志实时监测的示例详解
Apr 06 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
javascript一点特殊用法
2008/05/28 Javascript
javascript AutoScroller 函数类
2009/05/29 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
学习python (1)
2006/10/31 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
装潢设计实习自我鉴定
2013/09/19 职场文书
金属材料工程个人求职的自我评价
2013/12/04 职场文书
大学生军训广播稿
2014/01/24 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
Python pandas之求和运算和非空值个数统计
2021/08/07 Python