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 相关文章推荐
Windows下PyMongo下载及安装教程
Apr 27 Python
Python自动生产表情包
Mar 17 Python
Python 登录网站详解及实例
Apr 11 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
Django如何配置mysql数据库
May 04 Python
Python Web编程之WSGI协议简介
Jul 18 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
Python csv文件的读写操作实例详解
Nov 19 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
Python tkinter实现日期选择器
Feb 22 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制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
php 魔术方法详解
2014/11/11 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
重定向实现代码
2006/11/20 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
js setTimeout 常见问题小结
2013/08/13 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
python采集博客中上传的QQ截图文件
2014/07/18 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
车辆委托书范本
2014/10/05 职场文书
Java对文件的读写操作方法
2022/04/29 Java/Android
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技