一目了然——堆的概念及结构
文章目录
- 1.堆的概念和结构
- 1.1堆的概念
- 1.2堆的性质
- 1.3小根堆与大根堆
- 1.4堆的意义
- 1.5堆的实现
- 1.5.1完整代码
- 1.6选择题
1.堆的概念和结构
1.1堆的概念
如果有一个关键词的集合K = {k0,k1,k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+2 (Ki >= K2i+2) i = 0,1,2…则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
1.2堆的性质
堆中某个节点的值总是大于或小于其父节点的值;
堆总是一棵完全二叉树。
1.3小根堆与大根堆
小跟堆: 完全二叉树 树中所有的父亲都是小于等于孩子
大跟堆: 完全二叉树 树中所有的父亲都是大于等于孩子
注意:不是从小到大存的,不一定是有序的。
逻辑结构是想象出来的,堆的逻辑结构是个二叉树
物理结构是数组
1.4堆的意义
堆排序
——O(N*logN)
topk
选出最大的前k个
1.5堆的实现
建堆的时间复杂度是O(N)
插入
原先是小堆 插入的值会影响祖先,需要向上调整 如果孩子比父亲小就交换两个的值,直到当父亲小于孩子
删除(
只删除堆顶元素,删除任意地方的值没有意义
)
直接使用挪动数据覆盖删除,树中的父子关系会被打乱删除堆顶的数据,继续保持删除后数据还是小堆
将堆顶与最后一个数据交换,删除最后一个 --size就可以了
开始向下调整
选出左右孩子中小的那一个,小的这个孩子跟父亲比较
如果比父亲小则交换,继续往下走
如果比父亲大则调整结束
1.5.1完整代码
Heap.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include<stdbool.h>typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;//交换位置
void Swap(HPDataType* p1, HPDataType* p2);// O(logN)
void AdjustDwon(HPDataType* a, int size, int parent);
void AdjustUp(HPDataType* a, int child);void HeapPrint(HP* php);
void HeapInit(HP* php);
void HeapDestroy(HP* php);
void HeapPush(HP* php, HPDataType x);
void HeapPop(HP* php);
HPDataType HeapTop(HP* php);
bool HeapEmpty(HP* php);
int HeapSize(HP* php);
Heap.c
#include "Heap.h"void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}void HeapPrint(HP* php)
{assert(php);for (int i = 0; i < php->size; ++i){printf("%d ", php->a[i]);}printf("\n");
}void HeapInit(HP* php)
{assert(php);php->a = NULL;php->size = php->capacity = 0;
}void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}//向上调整
void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;//while (parent >= 0)while (child > 0){//if (a[child] < a[parent])if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){//扩容int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType)*newcapacity);if (tmp == NULL){printf("realloc fail\n");exit(-1);}//扩容成功php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;php->size++;AdjustUp(php->a, php->size - 1);
}void AdjustDwon(HPDataType* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){// 选出左右孩子中小/大的那个if (child + 1 < size && a[child + 1] > a[child]){++child;}// 孩子跟父亲比较if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapPop(HP* php)
{assert(php);assert(php->size > 0);Swap(&(php->a[0]), &(php->a[php->size - 1]));php->size--;AdjustDwon(php->a, php->size, 0);
}HPDataType HeapTop(HP* php)
{assert(php);assert(php->size > 0);return php->a[0];
}bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}int HeapSize(HP* php)
{assert(php);return php->size;
}
Test.c
#include "Heap.h"void TestHeap()
{HP hp;HeapInit(&hp);int a[] = { 27, 15, 19, 18, 28, 34, 65, 49, 25, 37 };for (int i = 0; i < sizeof(a) / sizeof(int); ++i){HeapPush(&hp, a[i]);}HeapPrint(&hp);HeapPush(&hp, 10);HeapPrint(&hp);HeapPop(&hp);HeapPrint(&hp);HeapPop(&hp);HeapPrint(&hp);
}int main()
{TestHeap();return 0;
}
1.6选择题
1.下列关键字序列为
堆
的是:()
A 100,60,70,50,32,65
B 60,70,65,50,32,100
C 65,100,70,32,50,60
D 70,65,100,32,50,60
E 32,50,100,70,65,60
F 50,100,70,65,60,32
2.已知
小根堆
为8,15,10,21,34,16,12,删除关键字 8 之后需重建堆,在此过程中,关键字之间的比较次
数是()。
A 1
B 2
C 3
D 4
3.一组记录排序码为(5 11 7 2 3 17),则利用
堆排序
方法建立的初始堆为
A(11 5 7 2 3 17)
B(11 5 7 2 17 3)
C(17 11 7 2 3 5)
D(17 11 7 5 3 2)
E(17 7 11 3 5 2)
F(17 7 11 3 2 5)
4.最小堆[0,3,2,5,7,4,6,8],在删除堆顶元素0之后,其结果是()
A[3,2,5,7,4,6,8]
B[2,3,5,7,4,6,8]
C[2,3,4,5,7,8,6]
D[2,3,4,5,6,7,8]
考察自己都做对了没有
答案
1.A
2.C
3.C
4.C
一目了然——堆的概念及结构相关推荐
- 【数据结构基础/接口函数编写】二叉树第一弹之树和堆的概念和结构、基础堆接口函数的实现(编写思路加逻辑分析加代码实操,一应俱全的汇总)
文章目录 树的概念及结构 树的概念 树的相关概念 树的表示 二叉树的概念及结构 二叉树的概念 特殊的二叉树: 二叉树的存储结构 二叉树的性质 顺序储存 链式储存 堆 堆的概念及结构 堆的实现 头文件 ...
- 教你一目了然树的概念与结构(入门级)
文章目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 2.2 特殊的二叉树: 2. ...
- 数据结构——数和二叉树的概念和结构
目录 一.数的概念及结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树的应用 二.二叉树概念及结构 2.1 概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存 ...
- 数据结构——树及二叉树的概念及结构的了解
文章目录 一.树概念及结构? 1.树的概念 2.树的相关概念 3.树的表示 4. 树在实际中的运用 二.叉树的概念及结构 1.概念 2.现实中的二叉树 3.特殊的二叉树 4.二叉树的性质 5.二叉树的 ...
- 【数据结构】二叉树的概念及结构
提示:学习此篇博客之前,可以先学习[数据结构]树的概念及结构. 文章目录 前言 1.二叉树的概念 2.特殊的二叉树 3.二叉树的性质 4.二叉树的存储结构 前言 普通二叉树,很难构成现实的应用场景,但 ...
- 理解 angular2 基础概念和结构 ----angular2系列(二)
前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...
- VC++和VC++.NET中与图像处理有关的几个概念、结构和类
VC++和VC++.NET中与图像处理有关的几个概念.结构和类 最近一直在看VC++有关图像处理方面的书,终于把以前一直混淆的几个概念.结构和类弄清楚了,特整理如下.如有错误,请大家批评指正,不胜感激 ...
- 【数据结构之二叉树】——二叉树的概念及结构,特殊的二叉树和二叉树性质
文章目录 一.二叉树的概念及结构 1.概念 2.现实中的二叉树 3. 特殊的二叉树: 3.二叉树的性质 二.二叉树练习题 总结 一.二叉树的概念及结构 1.概念 一棵二叉树是结点的一个有限集合,该集合 ...
- 可控硅的概念和结构工作特性
可控硅知识的问与答 一.可控硅的概念和结构? 晶闸管又叫可控硅.它的主要成员有单向晶闸管.双向晶闸管.光控晶闸管.逆导晶闸管.可关断晶闸管.快速晶闸管等等.今天大家使用的是单向晶闸管,也就是人们常说的 ...
最新文章
- 75. Find Peak Element 【medium】
- python画七边形的角度_python之turtle模块-生化危机
- 4.1.3 OS之文件目录目录结构(单级-两级-多级-无环图)、索引节点FCB瘦身
- python3爬取带密码的网站_Python3 爬取网站收藏数超过70的 情侣网名
- Python中的__init__和self是做什么的?
- 浅谈PHP语音里的流程控制及实现方法
- 中低频量化交易策略研发01_引言
- 大数据对人们的好处_大数据有什么作用和优势
- [jQuery] form提交到iframe之后,获取iframe里面内容
- java 次方_Java入门笔记0/3(基本数据结构)
- monkey命令总结
- ReMap:人类Chip-seq数据大全
- IntelliJ IDEA2021.1中英文菜单对照
- 基本的常见的锁的介绍
- 你的下一台电脑何必是电脑,探索不一样的远程操作
- 2023年天津仁爱学院高职升本科专业考试报考须知
- (五)Latex特殊符号
- 计算机毕业设计网吧管理,【毕业设计】计算机毕业设计网吧管理系统
- java手机壁纸_java-爬取手机高清壁纸
- html页面统计在线人数,统计在线人数couter