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 相关文章推荐
Pythont特殊语法filter,map,reduce,apply使用方法
Feb 27 Python
python requests 使用快速入门
Aug 31 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
在python环境下运用kafka对数据进行实时传输的方法
Dec 27 Python
Django实现单用户登录的方法示例
Mar 28 Python
python画图——实现在图上标注上具体数值的方法
Jul 08 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
python 图片二值化处理(处理后为纯黑白的图片)
Nov 01 Python
Python3爬虫关于识别点触点选验证码的实例讲解
Jul 30 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 Python
python区块链实现简版工作量证明
May 25 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运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
读jQuery之一(对象的组成)
2011/06/11 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
Listloading.js移动端上拉下拉刷新组件
2016/08/04 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
python中List的sort方法指南
2014/09/01 Python
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
浅析Python多线程下的变量问题
2015/04/28 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
Python有序字典简单实现方法示例
2017/09/28 Python
Python实现简单http服务器
2018/04/12 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
Python实现FTP文件传输的实例
2019/07/07 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
心理健康日活动总结
2014/05/08 职场文书
创先争优一句话承诺
2014/05/29 职场文书
软环境建设心得体会
2014/09/09 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
学期个人自我总结
2015/02/13 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android