算法导论程序11--堆排序算法(Python)
2017-05-12 09:44
232 查看
堆排序算法: def heapsort(self,A):
开始的时候,利用build_max_heap将输入数组A建成最大堆。因为数组中的最大元素总在根结点A[0]中。通过把它与A[len(A)-1]交换。可以让元素A[0]放到正确的位置。
这个时候,我们从堆中去掉A中的最后一个结点。即heap_size-1。其实heap_size起作用的地点主要在函数max_heapify(self,heap_size,A,i)中,就是维护堆的性质中,可以控制堆的大小。然后调用max_heapify(heap_size,A,0)这时候已经变成少一个元素的堆了。即是在元素A[0....len(A)-2]上构建的新的最大堆。
堆排序算法会不断重复这个过程。直到堆的大小从len(A)降到1。
运行:
def heapsort的时间复杂度是O(nlgn)
调用build_max_heap的时间复杂度是O(n)
一共n-1次调用max_heapify,每次的时间时O(lgn)
所以heapsort的时间复杂度是O(nlgn)
开始的时候,利用build_max_heap将输入数组A建成最大堆。因为数组中的最大元素总在根结点A[0]中。通过把它与A[len(A)-1]交换。可以让元素A[0]放到正确的位置。
这个时候,我们从堆中去掉A中的最后一个结点。即heap_size-1。其实heap_size起作用的地点主要在函数max_heapify(self,heap_size,A,i)中,就是维护堆的性质中,可以控制堆的大小。然后调用max_heapify(heap_size,A,0)这时候已经变成少一个元素的堆了。即是在元素A[0....len(A)-2]上构建的新的最大堆。
堆排序算法会不断重复这个过程。直到堆的大小从len(A)降到1。
import math class heapsort: def __init__(self,a_A,a_heap_size): self.list=a_A self.heap_size = a_heap_size def parent(self,i): return math.floor((i-1)/2) def left(self,i): return 2*i+1 def right(self,i): return 2*i+2 def max_heapify(self,heap_size,A,i): largest = i key = A[i] l = self.left(i) r = self.right(i) if l<heap_size and A[l] > A[largest]: largest = 2*i+1 if r<heap_size and A[r] > A[largest]: largest = 2*i+2 A[i]=A[largest] A[largest]=key if largest != i: self.max_heapify(heap_size,A,largest) return A def build_max_heap(self,A): N = math.floor(len(A)/2)-1 heap_size=len(A) for i in range(N,-1,-1): A = self.max_heapify(heap_size,A,i) return A def heapsort(self,A): self.build_max_heap(A) heap_size=len(A) for i in range(len(A)-1,0,-1): temp = A[0] A[0] = A[i] A[i] = temp heap_size-=1 self.max_heapify(heap_size,A,0)
运行:
>>> A=[16,4,10,14,7,9,3,2,8,1] >>> p = heapsort(A,10) >>> p.heapsort(A)
>>> A [1, 2, 3, 4, 7, 8, 9, 10, 14, 16]
def heapsort的时间复杂度是O(nlgn)
调用build_max_heap的时间复杂度是O(n)
一共n-1次调用max_heapify,每次的时间时O(lgn)
所以heapsort的时间复杂度是O(nlgn)
相关文章推荐
- python练习程序(c100经典例11)
- 如何用python制作一个锻炼计算能力的exe小程序-学习笔记11-pyinstaller
- 算法导论程序20--栈和队列(Python)
- 算法导论程序28--查询二叉搜索树(Python)
- 算法导论程序25--散列表(Python)
- 用Apache+mod_wsgi部署python程序 作者:leven | 日期2010-11-29 00:09:37
- 11-22C/C++/python程序编程
- 算法导论程序18-最大值和最小值(Python)
- 算法导论程序17-桶排序(Python)
- 算法导论程序30--红黑树的旋转(Python)
- 算法导论程序1--插入排序(Python+Java)
- 算法导论程序7--在线雇佣问题(Python)
- 算法导论程序5--雇佣问题(Python)
- 算法导论程序19-期望为线性时间的选择算法(Python)
- 算法导论程序14-快速排序的随机化版本(Python)
- 11 Python pyinstaller--将Python程序打包成单独的exe可执行文件
- 算法导论程序4--矩阵乘法的分治算法(Python)
- 算法导论程序12--优先队列(Python)
- 算法导论程序22--指针和对象的实现(Python)
- 算法导论程序39--最优二叉搜索树(Python)