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 相关文章推荐
使用wxpython实现的一个简单图片浏览器实例
Jul 10 Python
Python写的创建文件夹自定义函数mkdir()
Aug 25 Python
python基础教程之Hello World!
Aug 29 Python
Python内置函数的用法实例教程
Sep 08 Python
Python中splitlines()方法的使用简介
May 20 Python
python实现俄罗斯方块
Jun 26 Python
浅析python继承与多重继承
Sep 13 Python
python 函数内部修改外部变量的方法
Dec 18 Python
python按照多个条件排序的方法
Feb 08 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
opencv python如何实现图像二值化
Feb 03 Python
Python爬虫如何破解JS加密的Cookie
Nov 19 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/07/04 PHP
PHP代码保护--Zend Guard的使用详解
2013/06/03 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
python正则表达式中的括号匹配问题
2014/12/14 Python
python私有属性和方法实例分析
2015/01/15 Python
Python中super函数的用法
2017/11/17 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
详解python3中zipfile模块用法
2018/06/18 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
Django 批量插入数据的实现方法
2020/01/12 Python
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
毕业生写求职信的要点
2014/03/04 职场文书
食品流通安全承诺书
2014/05/22 职场文书
药剂专业自荐书
2014/06/20 职场文书
课外活动总结
2015/02/04 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP