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 continue语句用法实例
Mar 11 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
解决uWSGI的编码问题详解
Mar 24 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
Python 基础教程之str和repr的详解
Aug 20 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
numpy和pandas中数组的合并、拉直和重塑实例
Jun 28 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
pygame实现俄罗斯方块游戏(基础篇1)
Oct 29 Python
python获取array中指定元素的示例
Nov 26 Python
python实现求纯色彩图像的边框
Apr 08 Python
OpenCV项目实践之停车场车位实时检测
Apr 11 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
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
Prototype Date对象 学习
2009/07/12 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
浅谈Python的异常处理
2016/06/19 Python
Python实现随机选择元素功能
2017/09/14 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
Python标准库shutil用法实例详解
2018/08/13 Python
Python求离散序列导数的示例
2019/07/10 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
python构建指数平滑预测模型示例
2019/11/21 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
纯HTML5+CSS3制作生日蛋糕代码
2016/11/16 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
介绍一下grep命令的使用
2015/06/12 面试题
2014年五一劳动节社区活动总结
2014/04/14 职场文书