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双精度浮点数运算并分行显示操作示例
Jul 21 Python
python3.5基于TCP实现文件传输
Mar 20 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
Jan 08 Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 Python
Python Web框架之Django框架Model基础详解
Aug 16 Python
python基于opencv检测程序运行效率
Dec 28 Python
Tensorflow轻松实现XOR运算的方式
Feb 03 Python
pycharm中import呈现灰色原因的解决方法
Mar 04 Python
python实现对变位词的判断方法
Apr 05 Python
python3的pip路径在哪
Jun 23 Python
浅谈Python3中print函数的换行
Aug 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
PHP中GET变量的使用
2006/10/09 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
Python中的推导式使用详解
2015/06/03 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
综艺节目策划方案
2014/06/13 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
购房意向书
2014/08/30 职场文书
简历自我评价优缺点
2015/03/11 职场文书
毕业感言怎么写
2015/07/31 职场文书
教师节祝酒词
2015/08/11 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
Consul在linux环境的集群部署
2022/04/08 Servers