码迷,mamicode.com
首页 > 编程语言 > 详细

堆、堆排序

时间:2018-10-30 14:55:33      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:open   复杂度   sed   range   dex   nbsp   分享   最大的   父节点   

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

 

 

 

堆、堆排序

标签:open   复杂度   sed   range   dex   nbsp   分享   最大的   父节点   

原文地址:https://www.cnblogs.com/wdl1078390625/p/9876364.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!