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 enumerate遍历数组示例应用
Sep 06 Python
python中关于日期时间处理的问答集锦
Mar 08 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
Python读写docx文件的方法
May 08 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
使用Python快速制作可视化报表的方法
Feb 03 Python
Python3.5文件读与写操作经典实例详解
May 01 Python
Python实现RabbitMQ6种消息模型的示例代码
Mar 30 Python
Python Tornado核心及相关原理详解
Jun 24 Python
Python中Selenium模块的使用详解
Oct 09 Python
详解解决jupyter不能使用pytorch的问题
Feb 18 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 代码优化的42条建议 推荐
2009/09/25 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
理解javascript封装
2016/02/23 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
JavaScript实现移动端轮播效果
2017/06/06 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
详解Puppeteer 入门教程
2018/05/09 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
python实现简单购物商城
2016/05/21 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
python异常处理try except过程解析
2020/02/03 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
联想中国官方商城:Lenovo China
2017/10/18 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
民主生活会主持词
2015/07/01 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS