堆堆排序

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))
堆排序

 

 

 

以上是关于堆堆排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之二叉堆堆排序

堆堆排序与优先队列

建堆堆排序TopK问题大合集

07堆排序 python

数据结构—堆与堆排序

『算法设计_伪代码』堆排序