Python排序搜索基本算法之堆排序实例详解


Posted in Python onDecember 08, 2017

本文实例讲述了Python排序搜索基本算法之堆排序。分享给大家供大家参考,具体如下:

堆是一种完全二叉树,堆排序是一种树形选择排序,利用了大顶堆堆顶元素最大的特点,不断取出最大元素,并调整使剩下的元素还是大顶堆,依次取出最大元素就是排好序的列表。举例如下,把序列[26,5,77,1,61,11,59,15,48,19]排序,如下:

Python排序搜索基本算法之堆排序实例详解

基于堆的优先队列算法代码如下:

def fixUp(a): #在堆尾加入新元素,fixUp恢复堆的条件
  k=len(a)-1
  while k>1 and a[k//2]<a[k]:
    a[k//2],a[k]=a[k],a[k//2]
    k=k//2
def fixDown(a): #取a[1]返回的值,然后把a[N]移到a[1],fixDown来恢复堆的条件
  k=1
  N=len(a)-1
  while 2*k<=N:
    j=2*k
    if j<N and a[j]<a[j+1]:
      j+=1
    if a[k]<a[j]:
      a[k],a[j]=a[j],a[k]
      k=j
    else:
      break
def insert(a,elem):
  a.append(elem)
  fixUp(a)
def delMax(a):
  maxElem=a[1]
  N=len(a)
  if N<=1:
    print('There\'s none element in the list')
    return -1
  if N==2:
    return a[1]
  else:
    a[1]=a.pop()
    fixDown(a)
    return maxElem
data=[-1,] #第一个元素不用,占位
insert(data,26)
insert(data,5)
insert(data,77)
insert(data,1)
insert(data,61)
insert(data,11)
insert(data,59)
insert(data,15)
insert(data,48)
insert(data,19)
result=[]
N=len(data)-1
for i in range(N):
  print(data)
  result.append(delMax(data))
print(result)

fixUp函数用于向列表的尾部添加一个新的元素,然后调整成大顶堆;fixDown函数用于取出大顶堆最大的元素后,把列表尾部的元素放到堆顶位置,然后再调整成大顶堆;insert函数是每次插入一个新的元素并调整成为大顶堆;delMax函数把最大的元素返回出来并把剩下的元素调整成为大顶堆。

输出如下:

[-1, 77, 61, 59, 48, 19, 11, 26, 1, 15, 5]
[-1, 61, 48, 59, 15, 19, 11, 26, 1, 5]
[-1, 59, 48, 26, 15, 19, 11, 5, 1]
[-1, 48, 19, 26, 15, 1, 11, 5]
[-1, 26, 19, 11, 15, 1, 5]
[-1, 19, 15, 11, 5, 1]
[-1, 15, 5, 11, 1]
[-1, 11, 5, 1]
[-1, 5, 1]
[-1, 1]
[77, 61, 59, 48, 26, 19, 15, 11, 5, 1]

前面的输出是不断取出最大元素后的大顶堆,由于是完全二叉树,根据列表可以自己写出大顶堆的树形结构,就不在这里赘述,最后一行是排好序的列表。

下面是堆排序算法,代码如下:

def fixDown(a,k,n): #自顶向下堆化,从k开始堆化
  N=n-1
  while 2*k<=N:
    j=2*k
    if j<N and a[j]<a[j+1]: #选出左右孩子节点中更大的那个
      j+=1
    if a[k]<a[j]:
      a[k],a[j]=a[j],a[k]
      k=j
    else:
      break
def heapSort(l):
  n=len(l)-1
  for i in range(n//2,0,-1):
    fixDown(l,i,len(l))
  while n>1:
    l[1],l[n]=l[n],l[1]
    fixDown(l,1,n)
    n-=1
  return l[1:]
l=[-1,26,5,77,1,61,11,59,15,48,19] #第一个元素不用,占位
res=heapSort(l)
print(res)

输出如下:

[1, 5, 11, 15, 19, 26, 48, 59, 61, 77]
Python 相关文章推荐
详解Python中用于计算指数的exp()方法
May 14 Python
Python工程师面试题 与Python Web相关
Jan 14 Python
numpy中实现二维数组按照某列、某行排序的方法
Apr 04 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
基于keras输出中间层结果的2种实现方式
Jan 24 Python
tensorflow 自定义损失函数示例代码
Feb 05 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 Python
python不同版本的_new_不同点总结
Dec 09 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 #Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
Dec 08 #Python
python在ubuntu中的几种安装方法(小结)
Dec 08 #Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 #Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 #Python
python的unittest测试类代码实例
Dec 07 #Python
Python numpy 常用函数总结
Dec 07 #Python
You might like
支持oicq头像的留言簿(二)
2006/10/09 PHP
处理单名多值表单的详解
2013/06/08 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
PHP调用其他文件中的类
2018/04/02 PHP
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
Three.js快速入门教程
2016/09/09 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
基于JS递归函数细化认识及实用实例(推荐)
2017/08/07 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
2020/02/23 Javascript
python开发利器之ulipad的使用实践
2017/03/16 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
python3的pip路径在哪
2020/06/23 Python
学python爬虫能做什么
2020/07/29 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
社会实践自我鉴定
2013/11/07 职场文书
青年文明号事迹材料
2014/01/18 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
基督教婚礼主持词
2014/03/14 职场文书
行政监察建议书
2014/05/19 职场文书
公证委托书标准格式
2014/09/11 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
小学生暑假生活总结
2015/07/13 职场文书
高二英语教学反思
2016/03/03 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang
浅谈redis缓存在项目中的使用
2021/05/20 Redis