直观理解:二叉堆和堆排序(Heap)

  堆(Heap)是计算机中一种特殊的数据结构,通常可以看成一个完全二叉树的数组对象【如果一个二叉树的深度为\small k,除第 \small k 层外,其它各层 (\small 1~k-1) 的结点数都达到最大个数,第\small k 层所有的结点都连续集中在最左边,这就是完全二叉树】,堆根据堆顶存储的是最大元素还是最小元素,可以分为大根堆和小根堆。堆具有下列性质:

  • 堆中每个节点的值总是不大于(Max-heap)或者不小于(Min-heap)其父节点的值。
  • 堆总是一颗完全二叉树。

  由于堆满足完全二叉树的结构,因此可以用一个下表从1开始的数组来存储堆结构的内容,其中节点存储在下标\small k的两个子节点分别存放在下标为\small 2*k, 2*k + 1的位置中,而下标为\small k的节点的父节点的下标为\small k/2。如下图所示:

Max Heap

  假设当前元素的索引位置为 i,可以得到规律:

parent(i) = i / 2;
left_child(i) = 2 * i;
right_child(i) = 2 * i + 1;

  下面以大根堆为例,详细介绍堆的两个最基本的操作Shift Up和Shif Down的过程。

Shift Up

  向一个堆中插入一个元素的过程称之为shift up,首先将新插入的元素放在完全二叉树的最后一个位置,每次shift up时需要将当前节点与其父节点进行比较,如果当前节点大于其父节点,则交换当前节点和父节点的位置。直到当前节点不大于父节点为止。整个过程如下:

append new node
shift up
shift up and finished

Shift Down

  上面介绍了如何向一个堆中添加元素的过程,接下来介绍,如果移除堆顶的元素。移除堆顶元素的过程称为Shift Down,每一次移除堆顶元素时,需要用完全二叉树的最后一个元素进行补位,即将最后一个节点放在堆顶的位置,然后通过不断shift down操作,使得堆当前二叉树终满足堆的结构。每次shift down的时候需要将当前节点与其最大的叶子节点进行交换,不断重复这个过程,直到不能交换为止。

remove root
replace
shift down
shift down and finished

Heapify

  之前我们介绍到的Shift Up是通过,每次向构建好的堆中插入一个节点之后,进行堆化(Heapify)的过程,如果现在有一个已经给定的数组,怎么将其调整成一个符合条件的堆呢?这个调整的过程称之为堆化(Heapify)。堆化的过程其实也非常简单,就是从最后一个非叶子节点开始,依次倒序对每个非叶子节点执行Shift down的过程,每次执行完一个顶点之后,倒序找到下一个非叶子节点执行Shift Down的过程,直到最后对根节点执行完Shift Down,此时就能得到一个符合条件的堆。堆化的过程如下图所示:

original
step 1 shift down
step 2 shift down
step 3 shift down
step 4 shift down
step 5 shift down
finished

  至此,我们对堆进行了简单直观的介绍,二叉堆没有任何神秘的地方,主要操作也就是shift up和shift down,堆是一种非常有用的数据结构,通常用来实现优先级队列,在时间复杂度上,不论是shift up和shift down,最大时间复杂度也就是\small \log(N),因此,基于堆实现的优先级队列的追加和删除元素的实践复杂度都是\small \log(N)。以上就是堆的基本内容。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容