Sort.堆排序(heapsort) & 优先队列

二叉堆

这个二叉堆和先进后出的那个堆不是一个。
而且这个二叉堆从下标1开始存储元素。

这里的二叉堆是个数组,也可以看作是一个完全二叉树,除了最底层外,这颗二叉树是完全充满的。
堆数据结构:利用数组模拟了一个完全二叉树。(这里的堆不是那个先进后出的数据结构)

将树的根节点存放在数组的[1]位置。第二层的连个存放在[2]`[3]`,第三层存放在`[4]`[7]……
所以可以得到这样的规律:
数组中每个元素(假设在数组中的下标为k)在二叉树中的左节点存放在数组的[2k]中,而右节点存放在[2k+1]中。

通过数组来模拟一个 完全二叉树,从而实现排序的算法:堆排序

堆排序

二叉堆分为两种:最大二叉堆和最小二叉堆:

  1. 最大二叉堆(下面都以此为例
    每个节点[k]的值都比其左节点[2k]和右节点[2k+1]要大。但是,左右这两个节点之间的大小是不确定的,可以随意
  2. 最小二叉堆
    反之,每个节点都小于其左右节点。

性质

为了维护这种性质,所以需要一个函数去对比相对根节点和起左右节点的大小,然后选出一个最大的放在相对根节点的位置。然后如果相对根节点被换到左或者右节点,这时候又要去检测换完以后的一个小树叉的性质。所以这需要一个递归或者迭代再去检测新的相对根节点和其左右子节点(也就是之前的根节点被换到的位置)。
在对比相对根节点和其左右子节点之前,需要先判断这个相对根节点是否存在左右子节点,也就是左右节点在数组中的下标是否越界。
在最大二叉堆中,维护这种性质是使小元素下沉的过程(大元素只能上浮一个位置)。

建堆

为了将一个数组建成一个二叉堆,需要事数组中的元素符合上述性质。
所以我么你可以遍历每一个元素,这样她就可以满足了。
维护二叉堆性质的函数是让小元素下沉,而大元素只能上浮一层。所以,如果采用从头到尾遍历的话,那么大元素也只能上浮一层。
而采用从后向前遍历的话,在一层中一个大元素上浮以后,该函数遍历道上一层以后,又会在该节点执行一次。这样一个大元素可以被一直往上“赶”。

插入和删除

如果非要在二叉堆上实现插入和删除的话:

  1. 删除
    删除任意一个点,后面的数据先前进一位,会造成后面大量的树叉的性质改变。
    所以,采用另一种方式,把要删除的元素(下标为k)和最后一个元素交换,然山删除数组的最后一个元素。
    这时候只要调用维护性质的函数,将k位置的元素下沉就行了。

所以可以这个实现,依次将最大的元素删除或者提出。

  1. 添加的话(假设使用的是vector存储不是数组),那么需要将最后一位(也就是添加的)和第一位交换,然后重新建堆。

优先队列

如果将二叉堆中排序的元素看作是一种结构体,他有一个key:也就是被排序的值,还有一个value:也就是该元素自身所带有的值。
那么就可以实现一个优先队列。
key是权重,也就是要被处理的优先级。而value可以时要被处理的信息。
每次优先队列(二叉堆)pop出权重最大的元素,然后被某个函数处理。

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

推荐阅读更多精彩内容