【数据结构】堆、堆排序笔记

  • 堆是一棵完全二叉树,树的每个结点的值都不小于(或者不大于)其左右孩子的值。

  • 父亲结点大于等于孩子结点的值叫做大顶堆,反之叫做小顶堆

  • 大顶堆的每个结点的值都是以它为根结点的子树的最大值,反之最小值

  • 下面都以大顶堆为例子:

  • 两个兄弟之间不存在大小比较关系,堆只能说明某结点引导的子树的所有子结点都比它小,就像领导关系一样,下属之间或者领导之间可能有实力高低,但是领导是他的所有下属的最高级

  • 建堆:把所有非叶子结点都向下调整(从n/2开始直到1)

  • void createHeap() {
    for(int i = n / 2; i >= 1; i--)downAdjust(i, n);
    }
  • 向下调整:(不断和自己的左右孩子比较,把孩子的最大值和自己交换,直到结点的下标大于最后一个元素的数组下标high为止。记住:i结点的左孩子j结点满足j = i * 2;)

  • const int maxn = 100;
    int heap[maxn], n = 10;//对heap数组在[low, high]范围进行向下调整,其中low为欲调整的结点的数组下标,high一般为堆的最后一个元素的数组下标
    void downAdjust(int low, int high) {
    int i = 1ow, j = i * 2;//i为将要调整的结点,j为它的左孩子
    while(j <= high) {if(j + 1 <= high && heap[j + 1] > heap[j])j = j + 1; //那就让j存储数值最大的那个结点所对应的下标if(heap[j] > heap[i]) {swap(heap[i], heap[j]);i = j; j = i * 2;} else {break;}
    }
    }
  • 删除堆顶元素(用最后一个元素覆盖堆顶元素,然后让n- -,然后向下调整)

  • void deleteTop() {
    heap[1] = heap[n--];
    downAdjust(1, n);
    }
  • 增加一个元素(添加到最后一个结点的后面,然后进行向上调整操作)

  • void insert(int x) {
    heap[++n] = x;
    upAdjust(1, n);
    }
  • 向上调整操作就是把将要调整的结点与父亲结点比较,如果权值比父亲结点大,那么就交换其与父亲结点,这样反复比较,直到到达堆顶或者是父亲结点的权值比较大为止

  • void upAdjust(int low, int high) {//low一般传入1,high为将要调整的结点的数组下标
    int i = high, j = i / 2; //i为将要调整结点,j为其父亲
    while(j >= low) {if(heap[j] < heap[i]) {swap(heap[j], heap[i]);i = j; j = i / 2;} else {break;}
    }
    }
  • 堆排序:

    • 在建堆完毕后,堆排序就是取出堆顶元素,然后将堆的最后一个元素i替换至堆顶,再进行一次针对堆顶元素1向下调整(1, i - 1)范围,直到堆中只有一个元素为止(i == 2)
  • void heapSort() {
    createHeap();
    for(int i = n; i >= 2; i--) {swap(heap[i], hea[1]);downAdjust(1, i - 1);
    }
    }

【数据结构】堆、堆排序笔记相关推荐

  1. 数据结构源码笔记(C语言):堆排序

    //实现堆排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typede ...

  2. 数据结构与算法笔记(青岛大学王卓老师视频)

    写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...

  3. 数据结构期末复习笔记(NEU版)

    数据结构期末复习笔记 绪论 数据结构的概念 数据结构的分类 数据结构研究的内容 算法的重要特性 算法的设计要求 题目汇总 线性表 栈和队列 栈 队列 题目 数组与广义表 树 二叉树 二叉树的遍历 线索 ...

  4. 数据结构源码笔记(C语言描述)汇总

    数据结构源码笔记(C语言):英文单词按字典序排序的基数排序 数据结构源码笔记(C语言):直接插入排序 数据结构源码笔记(C语言):直接选择排序 数据结构源码笔记(C语言):置换-选择算法 数据结构源码 ...

  5. 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

    //实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...

  6. 数据结构源码笔记(C语言):索引文件建立和查找

    //实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...

  7. 数据结构源码笔记(C语言):快速排序

    //实现快速排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

  8. 数据结构源码笔记(C语言):冒泡排序

    //冒泡排序算法实现 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

  9. 数据结构源码笔记(C语言):希尔插入排序

    //实现希尔插入排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; ty ...

最新文章

  1. 做国内最好的ITSM服务管理软件
  2. 微软职位内部推荐-Senior Development Lead – Sharepoint
  3. java五大原则_Java成长第五集--面向对象设计的五大原则
  4. SCARA四轴机器人丝杆花键_花键丝杆一体轴型SCARA机器人的制作方法
  5. Windows Server 2008关闭默认windows共享
  6. Vertica系列: Vertica DB连接负载均衡
  7. anaconda环境中使用sudo python报错
  8. oracle什么是定长,数据库中定长类型(char)和变长类型(varchar2)有什么区别?
  9. oracle数字类型是什么格式,oracle字段类型NUMBER(38,3),括号中两个数字分别表示什么?...
  10. inline-block的几个问题(还没解决)
  11. PphpStorm常用操作整理
  12. hdu acm 1241
  13. Leetcode1160. 拼写单词(C语言)
  14. TypeScript Essential Notes 2 - ES6 Language Features
  15. spring boot+vue前后端分离项目问题总结
  16. excel使用教程_数据分析Excel必备技能:数据透视表使用教程
  17. 简易购物车实体类的设计
  18. 【苹果家庭推送】iMessage Number是一种及时静态(Differential Privacy)
  19. mysql数据库安全加固_数据库安全加固系统
  20. SYN 洪水攻击如何工作?

热门文章

  1. Django的应用部署
  2. 自定义video控制栏,移动端可行
  3. Python + Appium 环境搭建
  4. RedHat系列linux源码包软件的安装与卸载
  5. 【译】ASP.NET MVC 5 教程 - 4:添加模型
  6. 鸟哥Linux私房菜_基础篇(第二版)_第十章学习笔记
  7. 马化腾:整天在拍拍网上买东西,找感觉
  8. Drupal 更新开源编辑器 CKEditor,修复两个 XSS 漏洞
  9. 微软推出 Xbox 漏洞奖励计划,最高奖励2万美元
  10. UEditor应用 —— 图片上传