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中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
在Mac OS上搭建Python的开发环境
Dec 24 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
python实现连续图文识别
Dec 18 Python
在Python 不同级目录之间模块的调用方法
Jan 19 Python
Python常用模块之requests模块用法分析
May 15 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
Python-numpy实现灰度图像的分块和合并方式
Jan 09 Python
TensorFLow 变量命名空间实例
Feb 11 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
python os模块在系统管理中的应用
Jun 22 Python
python利用线程实现多任务
Sep 18 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位运算的简单权限设计
2013/06/30 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
php实现简单爬虫的开发
2016/03/28 PHP
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
Vue使用axios出现options请求方法
2019/05/30 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python守护进程用法实例分析
2015/06/04 Python
Python批量查询域名是否被注册过
2017/06/21 Python
python 生成器协程运算实例
2017/09/04 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
2020/02/23 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
小学五年级语文上册教学计划
2015/01/22 职场文书
公司表扬信格式
2015/05/04 职场文书
跳高加油稿
2015/07/21 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书
MySQL笔记 —SQL运算符
2022/01/18 MySQL