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 09 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
django创建简单的页面响应实例教程
Sep 06 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 Python
通过python检测字符串的字母
Feb 18 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
python requests模块的使用示例
Apr 07 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 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 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
jQuery 技巧小结
2010/04/02 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
ES6 class的应用实例分析
2019/06/27 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
Python入门_条件控制(详解)
2017/05/16 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python根据成绩分析系统浅析
2019/02/11 Python
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
教育局长自荐信范文
2013/12/22 职场文书
家长学校工作方案
2014/05/07 职场文书
影子教师研修方案
2014/06/14 职场文书
岗位聘任报告
2015/03/02 职场文书
医院病假条范文
2015/08/17 职场文书
导游词之沈阳植物园
2019/11/30 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL
Python各协议下socket黏包问题原理
2022/04/12 Python