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利用elaphe制作二维条形码实现代码
May 25 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
Python 调用Java实例详解
Jun 02 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
对python多线程与global变量详解
Nov 09 Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 Python
django drf框架中的user验证以及JWT拓展的介绍
Aug 12 Python
python 多进程队列数据处理详解
Dec 23 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
Django migrate报错的解决方案
May 20 Python
Python自动化测试PO模型封装过程详解
Jun 22 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获取一个字符串中间一部分字符的方法
2014/08/19 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
模仿jQuery each函数的链式调用
2009/07/22 Javascript
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
python从sqlite读取并显示数据的方法
2015/05/08 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
pytorch 固定部分参数训练的方法
2019/08/17 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
Python urllib3软件包的使用说明
2020/11/18 Python
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
师范生自荐信范文
2013/10/06 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
网站创业计划书
2014/04/30 职场文书
部门年终奖分配方案
2014/05/07 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
授权委托书公证
2014/09/14 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
交通事故被告代理词
2015/05/23 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技