数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序
#!/usr/bin/env python
# -*- coding:utf-8 -*- '''
Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序
重点的地方:小堆序堆顶的元素一定是堆里最小的,大堆序堆顶的元素一定是堆里最大的
小堆序:满足任何从上到下的线路依次增长
大堆序:满足任何从上到下的线路依次减小 效率:时间效率O(nlogn)
空间效率O(1)
''' #堆排序:因为队列里的元素是不满足小堆序的,所以首先要构建小堆序
#构建完小堆序后,从堆顶弹出元素(该元素最小)并将其放在堆的末尾;以此循环执行
#最终形成从大到小排序的队列
def little_heap_sort(elems):
def siftdown(elems, e, begin, end):
i, j = begin, begin*2+1
while j < end:
if j+1 < end and elems[j] > elems[j+1]:
j += 1
if e < elems[j]:
break
elems[i] = elems[j]
i, j = j, j*2 + 1
elems[i] = e #构建小堆序 O(n)
end = len(elems)
for i in range(end//2, -1, -1):
siftdown(elems, elems[i], i, end) #弹出堆顶元素放在末尾 O(nlogn)
for i in range(end-1, 0, -1): #O(n)
e = elems[i]
elems[i] = elems[0]
siftdown(elems, e, 0, i) #O(logn) # 堆排序:因为队列里的元素是不满足大堆序的,所以首先要构建大堆序
# 构建完大堆序后,从堆顶弹出元素(该元素最大)并将其放在堆的末尾;以此循环执行
# 最终形成从大到小排序的队列
def big_head_sort(elems):
def siftdown(elems, e, begin, end):
i, j = begin, begin*2 + 1
while j < end:
if j+1 < end and elems[j]<elems[j+1]:
j += 1
if e > elems[j]:
break
elems[i] = elems[j]
i, j = j, j*2 + 1
elems[i] = e #构建大堆序 O(n)
end = len(elems)
for i in range(end//2, -1, -1):
siftdown(elems, elems[i], i, end) #弹出堆顶元素放在末尾 O(nlogn)
for i in range(end-1, 0, -1):
e = elems[i]
elems[i] = elems[0]
siftdown(elems, e, 0, i) if __name__=="__main__":
l = [1,6,2,9,8,0,3,5,4,7]
little_heap_sort(l)
print(l)
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
big_head_sort(l)
print(l)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
堆排序: 构建堆序, 堆顶弹出, 放在堆尾,
(原)堆尾元素, 充当堆顶,向下筛选(siftdown)
数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序的更多相关文章
- 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...
- Python入门篇-数据结构堆排序Heap Sort
Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树 每个非叶子结点都要大于或者等于其左右孩子结点 ...
- 深入浅出数据结构C语言版(15)——优先队列(堆)
在普通队列中,元素出队的顺序是由元素入队时间决定的,也就是谁先入队,谁先出队.但是有时候我们希望有这样的一个队列:谁先入队不重要,重要的是谁的"优先级高",优先级越高越先出队.这样 ...
- 深入浅出数据结构C语言版(19)——堆排序
在介绍优先队列的博文中,我们提到了数据结构二叉堆,并且说明了二叉堆的一个特殊用途--排序,同时给出了其时间复杂度O(N*logN).这个时间界是目前我们看到最好的(使用Sedgewick序列的希尔排序 ...
- 数据结构之队列(Python 版)
数据结构之队列(Python 版) 队列的特点:先进先出(FIFO) 使用链表技术实现 使用单链表技术,在表首尾两端分别加入指针,就很容易实现队列类. 使用顺序表list实现 # 队列类的实现 cla ...
- 数据结构之 栈 (Python 版)
数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 class SStack(): ''' 基于顺序表 实现的 栈类 ''' def __init__ ...
- 数据结构之线性表(python版)
数据结构之线性表(python版) 单链表 1.1 定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- 学习笔记:[算法分析]数据结构与算法Python版[基本的数据结构-上]
线性结构Linear Structure ❖线性结构是一种有序数据项的集合,其中 每个数据项都有唯一的前驱和后继 除了第一个没有前驱,最后一个没有后继 新的数据项加入到数据集中时,只会加入到原有 某个 ...
随机推荐
- .NET平台和C#编程的总结
第一章 简单认识.NET框架 (1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework ...
- BI分析受阻?FineBI推出SPA螺旋式分析新功能!
过去,企业级的数据分析通常会有这么几种场景,业务部门托信息部门分析数据,结果报表一出,唇枪舌剑争论你我高低,数据不准,指标不对.信息部门欠缺业务概念,业务部门不懂技术逻辑,数据分析之路,暂时搁浅. 后 ...
- Android Weekly Notes Issue #237
Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...
- 执行git push出现"Everything up-to-date"
在github上git clone一个项目,在里面创建一个目录,然后git push的时候,出现报错"Everything up-to-date" 原因:1)没有git add . ...
- ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
- wp已死,metro是罪魁祸首!
1.这篇文章肯定会有类似这样的评论:“我就是喜欢wp,我就是喜欢metro,我就是软粉“等类似的信仰论者发表的评论. 2.2014年我写过一篇文章,windows phone如何才能在中国翻身? 我现 ...
- BootStrap_03之组件(手风琴、导航)
1.BootStrap组件--按钮组: .btn-group>.btn*5: .btn-group-justified: .btn-group-lg/sm/xs: .btn-group-vert ...
- Grunt(页面静态引入的文件地址的改变探究)-V2.0
相关插件的引用: grunt-usemin 对页面的操作 grunt-contrib-cssmin 压缩css load-grunt-tasks 瘦身gruntfile grunt-rev给md5 ...
- JavaScript权威设计--JavaScript脚本化文档Document与CSS(简要学习笔记十五)
1.Document与Element和TEXT是Node的子类. Document:树形的根部节点 Element:HTML元素的节点 TEXT:文本节点 >>HtmlElement与 ...
- 存储程序(1)——MYSQL
MySQL支持把几种对象存放在服务器端供以后使用.这几种对象有一些可以根据情况通过程序代码调用,有一些会在数据表被修改时自动执行,还有一些可以在预定时刻自动执行.它们包括以下几种: 1.存储函数(st ...