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做文本按行去重的实现方法
Oct 19 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 Python
python字典的setdefault的巧妙用法
Aug 07 Python
python实现两个文件夹的同步
Aug 29 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
Python基于gevent实现高并发代码实例
May 15 Python
python脚本定时发送邮件
Dec 22 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
Python爬虫定时计划任务的几种常见方法(推荐)
Jan 15 Python
Python使用pyecharts控件绘制图表
Jun 05 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
常用js脚本
2006/12/03 Javascript
一个选择最快的服务器转向代码
2009/04/27 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
js获取字符串字节数方法小结
2015/06/09 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
浅析Python3爬虫登录模拟
2018/02/07 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
保险专业大专生求职信
2013/10/26 职场文书
2013年军训通讯稿
2014/02/05 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
聘任书模板
2014/03/29 职场文书
产品生产计划书
2014/05/07 职场文书
小组名称和口号
2014/06/09 职场文书
保险专业求职信
2014/07/07 职场文书
培训科主任岗位职责
2014/08/08 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
大学四年个人总结
2015/03/03 职场文书
担保书范文
2019/07/09 职场文书
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL