堆堆排序
Posted wdl1078390625
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆堆排序相关的知识,希望对你有一定的参考价值。
堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
实现一个最大堆:
1 import random 2 3 def main(args): 4 a = [] 5 for i in range(100): 6 a.append(random.randint(1,100)) 7 print(a) 8 for i in range((100-1)//2,-1,-1): 9 max_heapify(a,i) 10 print(a) 11 return 0 12 13 14 15 def max_heapify(a,i): 16 left_child = 2 * i + 1 17 right_child = 2 * i + 2 18 large_index = i 19 if left_child < len(a) and a[left_child] > a[large_index]: 20 large_index = left_child 21 if right_child < len(a) and a[right_child] > a[large_index]: 22 large_index = right_child 23 if large_index != i: 24 tmp = a[i] 25 a[i] = a[large_index] 26 a[large_index] = tmp 27 max_heapify(a,large_index) 28 29 30 if __name__ == ‘__main__‘: 31 import sys 32 sys.exit(main(sys.argv))
堆排序思想:
1.首先使欲排序数组(下标从0到n)变成一个最大堆;
2.将数组的第一个元素与最后一个元素做交换,此时最后一个元素为数组中最大的元素。
3.继续对欲排序数组(下标从0到n-1)进行第1、2步操作,每次操作后将最大堆的第一个元素与第n-1个元素交换。
4.重复以上操作直至未排序数组长度为1,排序完毕。
堆排序时间复杂度:Θ(nlgn)
1 import random 2 3 def main(args): 4 a = [] 5 for i in range(100): 6 a.append(random.randint(1,100)) 7 print(a) 8 for i in range(len(a)-2): 9 for j in range((len(a)-1-i)//2,-1,-1): 10 max_heapify(a,j,len(a)-i) 11 tmp = a[0] 12 a[0] = a[len(a)-i-1] 13 a[len(a)-i-1] = tmp 14 print(a) 15 return 0 16 17 def max_heapify(a,i,k): 18 left_child = 2 * i + 1 19 right_child = 2 * i + 2 20 large_index = i 21 if left_child < k and a[left_child] > a[large_index]: 22 large_index = left_child 23 if right_child < k and a[right_child] > a[large_index]: 24 large_index = right_child 25 if large_index != i: 26 tmp = a[i] 27 a[i] = a[large_index] 28 a[large_index] = tmp 29 max_heapify(a,large_index,k) 30 31 if __name__ == ‘__main__‘: 32 import sys 33 sys.exit(main(sys.argv))
以上是关于堆堆排序的主要内容,如果未能解决你的问题,请参考以下文章