堆的简介以及堆排序

来源:互联网 发布:黑马程序员html 编辑:程序博客网 时间:2024/05/22 12:58

什么是堆?
堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:

Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]
或者
Key[i]>=Key[2i+1]&&key>=key[2i+2]

即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。
堆分为大顶堆和小顶堆,满足:
Key[i]>=Key[2i+1]&&key>=key[2i+2]
称为大顶堆,

满足: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]
称为小顶堆。

由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的。

堆排序的思想
利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。

其基本思想为(大顶堆):

  1. 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;

  2. 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];

  3. 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
    操作过程如下:

    • 初始化堆:将R[1..n]构造为堆;
    • 将当前无序区的堆顶元素R[1]同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。

因此对于堆排序,最重要的两个操作就是构造初始堆和调整堆,其实构造初始堆事实上也是调整堆的过程,只不过构造初始堆是对所有的非叶节点都进行调整。

小顶堆(网图):
小顶堆

下篇文章我会使用C#语言,代码实现堆排序。

参考推荐:https://jingyan.baidu.com/article/5225f26b057d5de6fa0908f3.html

阅读全文
'); })();
1 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 简单又漂亮的创城手抄一报 城旦舂 朱一旦 朱一旦到底什么来头 皮旦瘦肉粥做法 朱一旦真实身份 文旦柚 信誓旦旦 一旦怀孕奶水多久会停 一旦 一旦透析就要终身透吗 左西孟旦 危在旦夕 巴旦木杏仁 通宵达旦 有些人一旦错过就不在 天有不测风云人有旦夕祸福 天安门城楼 天安城楼 广济门城楼 城楼 嘉峪关城楼 城楼简笔画 南城楼价 天安门城楼开放 天安门城楼图片 天安门城楼恢复开放 天安门城楼简笔画 天安门城楼门票 天安门城楼高 登柳州城楼寄漳汀封连四州 天安门城楼画 天安门城楼照片 天安门城楼预约 天安门城楼怎么画 天安门城楼开放时间 天安门城楼多高 我正在城楼观山景 广济门城楼旅游 天安门城楼标语