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实现类的静态变量用法实例
May 08 Python
Python实现登录接口的示例代码
Jul 21 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
python爬取酷狗音乐排行榜
Feb 20 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
python爬虫 Pyppeteer使用方法解析
Sep 28 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
Python 抓取数据存储到Redis中的操作
Jul 16 Python
Python使用tkinter制作在线翻译软件
Feb 22 Python
能让Python提速超40倍的神器Cython详解
Jun 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微信网页授权的配置文件操作分析
2019/05/29 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
JSON取值前判断
2014/12/23 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
Javascript复制实例详解
2016/01/28 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python实现控制台输入密码的方法
2015/05/29 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
法院实习人员自我鉴定
2013/09/26 职场文书
大专学生推荐信范文
2013/11/19 职场文书
个人近期表现材料
2014/02/11 职场文书
《云房子》教学反思
2014/04/20 职场文书
雷人标语集锦
2014/06/19 职场文书
学术会议领导致辞
2015/07/29 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书