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人人网登录应用实例
Sep 26 Python
python3写爬取B站视频弹幕功能
Dec 22 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
Python单元测试简单示例
Jul 03 Python
python3 flask实现文件上传功能
Mar 20 Python
pytorch permute维度转换方法
Dec 14 Python
python+selenium 点击单选框-radio的实现方法
Sep 03 Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
Mar 10 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
python接口自动化框架实战
Dec 23 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 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
第十四节--命名空间
2006/11/16 PHP
phpMyAdmin 安装及问题总结
2009/05/28 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
php读取本地json文件的实例
2018/03/07 PHP
Javascript实现的分页函数
2007/02/07 Javascript
js压缩利器
2007/02/20 Javascript
JavaScript学习笔记(十)
2010/01/17 Javascript
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
python中Flask框架简单入门实例
2015/03/21 Python
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
高级工程师岗位职责
2013/12/15 职场文书
决心书标准格式
2014/03/11 职场文书
低碳环保标语
2014/06/12 职场文书
采购部长岗位职责
2014/06/13 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
长城导游词
2015/01/30 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技