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友情链接检查方法
Jul 08 Python
python实现K最近邻算法
Jan 29 Python
神经网络(BP)算法Python实现及应用
Apr 16 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
influx+grafana自定义python采集数据和一些坑的总结
Sep 17 Python
Python实现的统计文章单词次数功能示例
Jul 08 Python
Python如何在DataFrame增加数值
Feb 14 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
python用TensorFlow做图像识别的实现
Apr 21 Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 Python
python3.7添加dlib模块的方法
Jul 01 Python
OpenCV-Python实现轮廓拟合
Jun 08 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
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
让IE8浏览器支持function.bind()方法
2014/10/16 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
2016/09/23 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python标准库与第三方库详解
2014/07/22 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
python输出pdf文档的实例
2020/02/13 Python
通过实例解析python and和or使用方法
2020/11/14 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
自我评价的范文
2014/02/02 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
iPhone13再次曝光
2021/04/15 数码科技
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
关于python爬虫应用urllib库作用分析
2021/09/04 Python
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
golang语言指针操作
2022/04/14 Golang