最近在使用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
分享到:
相关推荐
堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和...
本资源“Python实现堆排序.rar”提供了一个用Python语言编写的堆排序实现示例,通过分析这个代码,我们可以深入理解堆排序的工作原理以及如何在Python中实现它。 堆排序是一种基于比较的排序算法,其核心思想是利用...
Python实现堆排序算法的代码通常包含两个主要函数:一个用于构建堆,另一个用于实际的排序过程。堆构建函数通常采用递归方式,利用父节点和子节点之间的关系来确保每个节点都满足堆的性质。排序过程则通过不断交换堆...
Python中的堆排序算法实现通常包括两个主要步骤:建立堆(heapify)和堆排序过程。建立堆是将一个无序的列表调整成一个最大堆(或最小堆)。堆排序过程则是通过一系列的堆顶元素与末尾元素的交换,逐步缩小堆的范围...
Python中的堆排序算法包含两个主要的函数:heapify和heapsort。 heapify函数是构建堆的关键步骤,它的目的是确保堆满足最大堆或最小堆的性质。在给定的代码中,heapify函数通过比较父节点和子节点的值,并在必要时...
堆排序(Heap Sort)是一种高效的排序算法,其基本思想是利用最大堆(或最小堆)这种数据结构来实现排序。堆是一种特殊的树形数据结构,满足堆的性质:对于最大堆,父节点的值大于等于子节点的值;对于最小堆,父...
python python_十大排序算法实现之堆排序
冒泡排序代码,使用 Python 进行插入排序、选择排序、冒泡排序、合并排序、快速排序、堆排序的代码。 插入排序是一种简单的排序算法,通过构建有序序列,将未排序的元素逐一插入到已排序的部分。该算法适用于小规模...
最后提供了Python实现堆排序的示例代码,通过示例展示了如何使用堆排序对数组进行排序。 适用人群:具备基本编程能力的学习者或开发者,尤其是对数据结构与算法感兴趣的学生和技术爱好者。 使用场景及目标:帮助初学...
插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入...
Python实现堆排序的程序不需要导入任何外部模块,这是因为它完全依赖于Python的基本数据结构和控制流程。在Python中,可以使用列表(list)来模拟堆的数据结构,列表的索引方式非常适合实现完全二叉树的性质。对于堆...
压缩包内的文件名为“通过python实现一个堆排序示例代码.docx”,这意味着该文件可能是一个Word文档,它包含了使用Python语言实现堆排序算法的示例代码。文档中可能详细地解释了堆排序的原理,展示了如何使用Python...
在Python中实现堆排序,可以使用内置的`heapq`库,或者自己构建堆并进行调整。上述代码提供了一个自定义的实现方式,主要包含以下几个函数: - `swap_param`:交换列表中两个指定位置的元素。 - `heap_adjust`:...
冒泡排序:应用Java和Python实现冒泡排序算法 冒泡排序:应用Java和Python实现冒泡排序算法 冒泡排序:应用Java和Python实现冒泡排序算法 冒泡排序:应用Java和Python实现冒泡排序算法 冒泡排序:应用Java和Python...
本文实例讲述了Python实现堆排序的方法。分享给大家供大家参考,具体如下: 堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是一种原地排序...
在Python中,我们可以利用内置的数据结构heapq模块来轻松实现堆排序。下面将详细介绍堆排序的原理、Python实现以及如何使用heapq模块。 ### 堆排序的基本概念 堆排序是一种树形选择排序,它利用完全二叉树(即每个...
# sort.heapSort() #堆排序 # sort.countSort() #计数排序 # sort.quickSort() #快速排序 该排序算法把每次的排序结果都列出来,可供初学者学习。 self.arr存放的是待排序列表,可改成自己的数据
### Python3实现堆排序算法详解 #### 一、堆排序简介 堆排序是一种高效、比较式的内部排序算法,它的基本思想是将待排序的数据集合构造成一个二叉堆(最大堆或最小堆),然后逐步缩小堆的范围,直到整个序列有序。 ...
Python 堆排序原理及代码实现 Python 堆排序是一种高效的排序算法,其基本思想是将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时...
选择排序22.py python对选择排序的代码实现选择排序22.py python对选择排序的代码实现选择排序22.py python对选择排序的代码实现选择排序22.py python对选择排序的代码实现选择排序22.py python对选择排序的代码实现...