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 sqlobject(mysql)中文乱码解决方法
Nov 14 Python
分享6个隐藏的python功能
Dec 07 Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 Python
使用python socket分发大文件的实现方法
Jul 08 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
python异常处理try except过程解析
Feb 03 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
Python利用myqr库创建自己的二维码
Nov 24 Python
celery在python爬虫中定时操作实例讲解
Nov 27 Python
Python 的 f-string 可以连接字符串与数字的原因解析
Feb 20 Python
python tkinter模块的简单使用
Apr 07 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
php 生成短网址原理及代码
2014/01/23 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
node内置调试方法总结
2018/02/22 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
python中查看变量内存地址的方法
2015/05/05 Python
Python抓取电影天堂电影信息的代码
2016/04/07 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
Python饼状图的绘制实例
2019/01/15 Python
python ftplib模块使用代码实例
2019/12/31 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
《小猪家的桃花树》教学反思
2014/04/11 职场文书
清明节演讲稿
2014/05/27 职场文书
端午节活动总结
2014/08/26 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
毕业生个人总结
2015/02/28 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
庆元旦主持词
2015/07/06 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书