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加pyGame实现的简单拼图游戏实例
May 15 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
python requests使用socks5的例子
Jul 25 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
python如何实现单链表的反转
Feb 10 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 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 smarty 二级分类代码和模版循环例子
2011/06/16 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
js AspxButton的客户端操作
2009/06/26 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
animate动画示例(泪奔的小孩)及stop和delay的使用
2013/05/06 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
python中如何使用朴素贝叶斯算法
2017/04/06 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
python urllib爬虫模块使用解析
2019/09/05 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
班风口号
2014/06/18 职场文书
员工2014年度工作总结
2014/12/09 职场文书
大学生毕业个人总结
2015/02/15 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
大学生读书笔记大全
2015/07/01 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技