算法导论程序11--堆排序算法(Python)
来源:互联网 发布:淘宝特卖网站 编辑:程序博客网 时间:2024/06/01 22:08
堆排序算法: 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。
import mathclass 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]
调用build_max_heap的时间复杂度是O(n)
一共n-1次调用max_heapify,每次的时间时O(lgn)
所以heapsort的时间复杂度是O(nlgn)
0 0
- 算法导论程序11--堆排序算法(Python)
- 算法导论程序8--堆(Python)
- 堆排序(算法导论)
- 堆排序(算法导论)
- 算法导论堆排序python实现
- 算法导论—堆排序(python)
- 算法导论 堆排序
- 算法导论--堆排序
- 【算法导论】 堆排序
- 算法导论-----堆排序
- 【算法导论】堆排序
- 算法导论-堆排序
- 堆排序--算法导论
- 算法导论:堆排序
- 算法导论:堆排序
- 【算法导论】堆排序
- 算法导论--堆排序
- 算法导论 堆排序
- js函数解释(包括内嵌,对象等)
- 理解CXF JaxWsDynamicClientFactory jaxb绑定时的错误
- Network Dictionary – cVLAN and sVLAN
- opencv的基本数据结构
- s5pv210——按键
- 算法导论程序11--堆排序算法(Python)
- 根据接口服务端发送请求
- 1,List<VideoTotal> list; 根据VideoTotal的videoNum属性 把list 分组。2,把List<VideoTotal>list 根据VideoTotal属性去重
- Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
- 三目运算
- java:读取文件
- Butter Knife
- 全栈工程师之路-中级篇之小程序开发-第一章第一节注册小程序
- java的Object类的学习