最近在使用java 的PriorityBlockingQueue 发现其排序使用的是堆排序 ,于是借这个周末翻了一下大学时候的数据结构的书好好复习了下,堆排序是一种选择排序,堆的定义: n各元素的序列{k1, k2, k3, ……kn},当且仅当满足ki <= k2i && ki <= k2i + 1(小顶堆) 或者 ki >= k2i && ki >= k2i+1(大顶堆) 的关系时,称之为堆。
如何构建这样的一个堆呢?
我们现在有这样的一个序列 :
{49,38,65,97,76,13,27,49} , 反映成二叉树就是:
我们可以将此树按非终端结点分成4个部分 , 按 index 为 4,3 , 2 , 1 的四个顶部节点 自低向上对每个部分按堆的规则进行调整 最后就可以得到一个堆:
def heap_adjust(list,index):
size = len(list)
lt = index * 2
rt = index * 2 + 1
largest = index
if lt <= size and list[lt-1] >= list[largest-1] :
largest = lt
if rt <= size and list[rt-1] >= list[largest-1] :
largest = rt
if largest != index :
temp = list[index-1]
list[index-1] = list[largest-1]
list[largest-1] = temp
heap_adjust(list,largest)
def build_heap(list):
length = len(list)
for index in range(length/2,0,-1):
heap_adjust(list,index)
def heap_pop(list):
r = None
length = len(list)
if length >= 1:
r = list[0]
if length >= 2:
list[0] = list[length-1]
list[length-1] = None
list.remove(None)
heap_adjust(list,1)
return r
def heap_append(list,item):
list.append(item)
build_heap(list)
if __name__ == '__main__':
list = [49,38,65,97,76,13,27,49]
build_heap(list)
print list
heap_append(list,100)
print list
length = len(list)
for i in range(length):
print '%d ' % heap_pop(list),
heap_adjust 方法的作用是对每个部分按堆的规则进行调整,在pop 数据时 把第一个数据pop 以后 然后把最后一个数据赋值给第一个
数据 这样就不会对其余数据的顺序造成影响 只需要对第一个数据进行一次 堆调整就好了……
堆排序在记录较少时不值得提倡,但是在大数据量时还是很有效的 ……
- 大小: 54.7 KB
- 大小: 523.1 KB
分享到:
相关推荐
堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现堆排序9.py 使用python实现...
堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现堆排序6.py 使用python实现...
堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用...
Python实现堆排序.rar
堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python的代码实现堆排序.py 使用python...
python的堆排序源码.txt
基于python的堆排序算法设计与实现
堆排序
插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入...
本文实例讲述了Python实现堆排序的方法。分享给大家供大家参考,具体如下: 堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是一种原地排序...
python 堆排序原理及代码实现
# sort.heapSort() #堆排序 # sort.countSort() #计数排序 # sort.quickSort() #快速排序 该排序算法把每次的排序结果都列出来,可供初学者学习。 self.arr存放的是待排序列表,可改成自己的数据
选择排序22.py python对选择排序的代码实现选择排序22.py python对选择排序的代码实现选择排序22.py python对选择排序的代码实现选择排序22.py python对选择排序的代码实现选择排序22.py python对选择排序的代码实现...
堆排序 堆是一种完全二叉树(是除了最后一层,其它每一层都被完全填充,保持所有节点都向左对齐),首先需要知道概念:最大堆问题,最大堆就是根节点比子节点值都大,并且所有根节点都满足,那么称它为最大堆。反之...
用Python实现选择排序
python八个常用排序(插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序)
堆排序
完整详细版Python全套教学课件 第05节 堆排序实现.pdf
/usr/bin/python import sys def left_child(node): return node * 2 + 1 def right_child(node): return node * 2 + 2 def parent(node): if (node % 2): return (i – 1) / 2 else: return (i – 2) / 2 def max_...