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中的Numeric包和Numarray包使用教程
Apr 13 Python
Python删除windows垃圾文件的方法
Jul 14 Python
对python程序内存泄漏调试的记录
Jun 11 Python
python实现停车管理系统
Nov 30 Python
postman模拟访问具有Session的post请求方法
Jul 15 Python
python+numpy实现的基本矩阵操作示例
Jul 19 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
浅谈Python __init__.py的作用
Oct 28 Python
Python爬虫之自动爬取某车之家各车销售数据
Jun 02 Python
python爬取某网站原图作为壁纸
Jun 02 Python
python 爬取天气网卫星图片
Jun 07 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
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
php数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
php while循环控制的简单实例
2016/05/30 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
2019/11/13 PHP
重定向实现代码
2006/11/20 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
python 遍历pd.Series的index和value
2019/11/26 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
事业单位绩效考核实施方案
2014/03/27 职场文书
团委竞选演讲稿
2014/04/24 职场文书
入党综合考察材料
2014/06/02 职场文书
骨干教师个人总结
2015/02/11 职场文书
2019银行竞聘书
2019/06/21 职场文书
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android