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 16 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
python实现ID3决策树算法
Dec 20 Python
python读取视频流提取视频帧的两种方法
Oct 22 Python
Python基于dom操作xml数据的方法示例
May 12 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
python版百度语音识别功能
Jul 09 Python
Python3远程监控程序的实现方法
Jul 15 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
Python是什么 Python的用处
May 26 Python
Python 存取npy格式数据实例
Jul 01 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函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
Python下使用Psyco模块优化运行速度
2015/04/05 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
python 格式化输出百分号的方法
2019/01/20 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
python编写实现抽奖器
2020/09/10 Python
快速创建python 虚拟环境
2020/11/28 Python
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
旷课检讨书大全
2014/01/21 职场文书
党支部综合考察意见
2015/06/01 职场文书
反邪教观后感
2015/06/11 职场文书
党课主持词大全
2015/06/30 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python