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实现的百度站长自动URL提交小工具
Jun 27 Python
OpenCV+python手势识别框架和实例讲解
Aug 03 Python
python协程之动态添加任务的方法
Feb 19 Python
python tkinter基本属性详解
Sep 16 Python
关于Python3 lambda函数的深入浅出
Nov 27 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
python各层级目录下import方法代码实例
Jan 20 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
python怎么删除缓存文件
Jul 19 Python
Python求区间正整数内所有素数之和的方法实例
Oct 13 Python
Python如何急速下载第三方库详解
Nov 02 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中计算字符串相似度的函数代码
2012/12/29 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
js实现随机抽奖
2020/03/19 Javascript
node.js通过url读取文件
2020/10/16 Javascript
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python笔记(2)
2012/10/24 Python
简单的Python的curses库使用教程
2015/04/11 Python
Python的Flask框架的简介和安装方法
2015/11/13 Python
Python实现简单多线程任务队列
2016/02/27 Python
理解Python中的With语句
2016/03/18 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
医药个人求职信范文
2014/01/29 职场文书
爽歪歪广告词
2014/03/20 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书