编程思想 - 堆排序

标签: 思想总结
4人阅读 评论(0) 收藏 举报
分类:

堆是一颗完全二叉树。

简而言之,一个二叉树是饱满的---即二叉树都满了,即使没有饱满,那么上一层都是饱满,最后一层叶子节点从左向右排列。


但是堆相对于完全二叉树有了自己的特点,堆分成最大堆及最小堆,

对于最大堆有:

1、根节点(堆顶)的关键字是最大(至少要大于或等于)的;

2、父亲节点必然比左右子节点都要大(至少等于)--左右节点之间没有大小之分,但是都比父亲节点少。


对于最小堆,性质类似:

1、根节点(堆顶)比所有子节点都小或等于;

2、父亲节点比左右子节点都要小或等于。

堆的存储

一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。


堆操作

最大堆的插入 --- 节点上浮

由于需要维持完全二叉树的形态,需要先将要插入的结点x放在最底层的最右边,插入后满 足完全二叉树的特点; 
  然后把x依次向上调整到合适位置满足堆的性质,例如下图中插入80,先将80放在最后,然后两次上浮到合适位置. 
  时间:O(logn)。  “结点上浮” 



最大堆的删除  --- 节点下沉 

操作原理是:当删除节点的数值时,原来的位置就会出现一个孔,填充这个孔的方法就是, 
把最后的叶子的值赋给该孔并下调到合适位置,最后把该叶子删除。 节点下沉



堆的初始化

调整法:

序列对应一个完全二叉树;从最后一个分支结点(n div 2)开始,到根(1)为止,依次对每个分支结点进行调整(下沉),
以便形成以每个分支结点为根的堆,当最后对树根结点进行调整后,整个树就变成了一个堆。 
  时间:O(n) 

对如图的序列,要使其成为堆,我们从最后一个分支结点(10/2),其值为72开始,依次对每个分支节点53,18,36 45进行调整(下沉). 








参照:

https://blog.csdn.net/morewindows/article/details/6709644/

https://blog.csdn.net/abcd1f2/article/details/47260095


查看评论

数据结构JAVA版2017教学视频课程

-
  • 1970年01月01日 08:00

编程思想总结 - 堆排序

二叉树 之 堆排序
  • tianyeshiye
  • tianyeshiye
  • 2018-04-15 14:12:58
  • 0

《C编程思想》 pdf

  • 2010年02月06日 15:29
  • 13.21MB
  • 下载

C++编程思想(第二版)源代码

  • 2012年11月15日 21:00
  • 1.42MB
  • 下载

你知道几种编程思想?

四大编程思想简述 1)POP--面向过程编程(Process-oriented programming ): 面向过程编程是以功能为中心来进行思考和组织的一种编程方法,它强调的是系统的数据被...
  • chenmoimg_
  • chenmoimg_
  • 2017-03-10 11:49:41
  • 614

C++编程思想.pdf

  • 2013年08月09日 17:15
  • 10.73MB
  • 下载

C++编程思想(两卷合订本)].(Bruce等).刘宗田等.扫描版.pdf

  • 2013年07月29日 16:59
  • 72.61MB
  • 下载

一位十年软件工程师告诉你什么是编程思想

什么是编程思想?答案可能很会复杂,但也可以很简单。一句话来讲就是,用计算机来解决人们实际问题的思维方式,即编程思想。  我们学习编程语言的最终目的,就是希望用计算机来解决我们的实际问题。那么学习计算...
  • shupan001
  • shupan001
  • 2011-09-27 00:46:01
  • 38652

谈谈编程思想

http://mp.weixin.qq.com/s?__biz=MzA3NDM0ODQwMw==&mid=201914347&idx=1&sn=4514f1d6fa7fe2a89137f8b6eb05...
  • z_l_l_m
  • z_l_l_m
  • 2014-04-24 21:09:16
  • 1456

C编程思想(比较好的一本书)

  • 2009年12月08日 12:39
  • 10.78MB
  • 下载
    个人资料
    等级:
    访问量: 1318
    积分: 287
    排名: 27万+
    博客专栏
    最新评论