当前位置:
首页 > Python基础教程 >
-
用 python 实现各种排序算法(4)
不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s)1<s<2
堆排序 ( Heap Sort )
"堆”的定义:在起始索引为 0 的“堆”中:
节点 i 的右子节点在位置 2 * i + 24) 节点 i 的父节点在位置 floor( (i - 1) / 2 ) : 注 floor 表示“取整”操作
堆的特性:
每个节点的键值一定总是大于(或小于)它的父节点
“最大堆”:
“堆”的根节点保存的是键值最大的节点。即“堆”中每个节点的键值都总是大于它的子节点。
上移,下移 :
当某节点的键值大于它的父节点时,这时我们就要进行“上移”操作,即我们把该节点移动到它的父节点的位置,
而让它的父节点到它的位置上,然后我们继续判断该节点,直到该节点不再大于它的父节点为止才停止“上移”。
现在我们再来了解一下“下移”操作。当我们把某节点的键值改小了之后,我们就要对其进行“下移”操作。
方法:
我们首先建立一个最大堆(时间复杂度O(n)),然后每次我们只需要把根节点与最后一个位置的节点交换,然后把最后一个位置排除之外,然后把交换后根节点的堆进行调整(时间复杂度 O(lgn) ),即对根节点进行“下移”操作即可。 堆排序的总的时间复杂度为O(nlgn).
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#!/usr/bin env python # 数组编号从 0开始 def left(i): return 2 * i + 1 def right(i): return 2 * i + 2 #保持最大堆性质 使以i为根的子树成为最大堆 def max_heapify(A, i, heap_size): if heap_size < = 0 : return l = left(i) r = right(i) largest = i # 选出子节点中较大的节点 if l A[largest]: largest = l if r A[largest]: largest = r if i ! = largest : #说明当前节点不是最大的,下移 A[i], A[largest] = A[largest], A[i] #交换 max_heapify(A, largest, heap_size) #继续追踪下移的点 #print A # 建堆 def bulid_max_heap(A): heap_size = len (A) if heap_size > 1 : node = heap_size / 2 - 1 while node > = 0 : max_heapify(A, node, heap_size) node - = 1 # 堆排序 下标从0开始 def heap_sort(A): bulid_max_heap(A) heap_size = len (A) i = heap_size - 1 while i > 0 : A[ 0 ],A[i] = A[i], A[ 0 ] # 堆中的最大值存入数组适当的位置,并且进行交换 heap_size - = 1 # heap 大小 递减 1 i - = 1 # 存放堆中最大值的下标递减 1 max_heapify(A, 0 , heap_size) if __name__ = = '__main__' : A = [ 10 , - 3 , 5 , 7 , 1 , 3 , 7 ] print 'Before sort:' ,A heap_sort(A) print 'After sort:' ,A |
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式