堆、堆排序

堆(英语: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))
堆排序

猜你喜欢

转载自www.cnblogs.com/wdl1078390625/p/9876364.html