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的web.py框架实现类似Django的ORM查询的教程
May 02 Python
python装饰器与递归算法详解
Feb 18 Python
Python自动化运维和部署项目工具Fabric使用实例
Sep 18 Python
Python微信公众号开发平台
Jan 25 Python
python如何实现int函数的方法示例
Feb 19 Python
Python爬虫框架Scrapy常用命令总结
Jul 26 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
python无序链表删除重复项的方法
Jan 17 Python
Python办公自动化之Excel(中)
May 24 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 Python
Pillow图像处理库安装及使用
Apr 12 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静态类
2006/11/25 PHP
PHP分页显示制作详细讲解
2008/11/19 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
PHP文件操作方法汇总
2015/07/01 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
JS event使用方法详解
2008/04/28 Javascript
JavaScript入门教程(3) js面向对象
2009/01/31 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
django模板语法学习之include示例详解
2017/12/17 Python
Python实现的计算器功能示例
2018/04/26 Python
Python工厂函数用法实例分析
2018/05/14 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
关于python写入文件自动换行的问题
2018/06/23 Python
python机器学习之神经网络实现
2018/10/13 Python
pytorch permute维度转换方法
2018/12/14 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
python循环输出三角形图案的例子
2019/11/22 Python
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
大学生暑期实践感言
2014/02/26 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python