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 相关文章推荐
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
浅谈python中对于json写入txt文件的编码问题
Jun 07 Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
python:接口间数据传递与调用方法
Dec 17 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
python实现动态数组的示例代码
Jul 15 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
详解Pycharm与anaconda安装配置指南
Aug 25 Python
python类共享变量操作
Sep 03 Python
解决pytorch 数据类型报错的问题
Mar 03 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模拟QQ登录的方法
2015/07/29 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
xml转json的js代码
2012/08/28 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
Python中操作符重载用法分析
2016/04/29 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python 3.8 新功能全解
2019/07/25 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
Python自动化测试基础必备知识点总结
2021/02/07 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
中国制造网:Made-in-China.com
2019/10/25 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
大学生就业推荐信范文
2013/11/29 职场文书
小学教师事迹材料
2014/01/13 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
红旗方阵解说词
2014/02/12 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
Go timer如何调度
2021/06/09 Golang