堆
时间:2019-02-21
本文章向大家介绍堆,主要包括堆使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
堆的定义与基本操作
堆的数组定义:
const int maxn = 100;
int heap[maxn] , n = 10;//heap为堆,n为元素个数
向下调整的代码:
void downAdjust(int low,int high){
int i = low,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]){ //如果孩子中最大的权值比欲调整结点i大
swap(heap[j],heap[i]); //交换最大权值的孩子与欲调整结点i
i = j; //保持i为欲调整结点,j为i的左孩子
j = i*2;
}else{
break; //孩子的权值均比欲调整结点i小,调整结束
}
}
}
建堆的代码:
void createHeap(){
for(int i = n / 2;i >= 1;i--){
downAdjust(i,n);
}
}
删除堆顶元素代码:
void deleteTop(){
heap[1] = heap[n--];//用最后一个元素覆盖堆顶元素,并让元素个数减1
downAdjust(1,n); //向下调整堆顶元素
}
向上调整的代码:
void upAdjust(int low,int high){
int i = high,j = i / 2;//i为欲调整结点,j为其父亲
while(j >= low){ //父亲在[low,high]范围内
if(heap[j] < heap[i]){//父亲权值小于欲调整结点i的权值
swap(heap[j],heap[i]);//交换父亲和欲调整结点
i = j; //保持i为欲调整结点,j为i的父亲
j = i / 2;
}else{
break;//父亲权值比欲调整结点i的权值大,调整结束
}
}
}
添加元素的代码:
void insert(int x){
heap[n++] = x; //让元素个数加1,然后将数组末位赋值为x
upAdjust(1,n); //向上调整新加入的结点n
}
堆排序
堆排序代码如下:
void heapSort(){
createHeap(); //建堆
for(int i = n;i > 1;i--){//倒着枚举,直到堆中只有一个元素
swap(heap[i],heap[1]);//交换heap[i]与堆顶
downAdjust(1,i - 1); //调整堆顶
}
}
- 【AngularJS】—— 3 我的第一个AngularJS小程序
- 【Spring实战】—— 2 构造注入
- 共享单车运维“朋友圈”越来越宽,乱停乱放现象有望改善吗?
- 【Spring实战】—— 15 Spring JDBC模板使用
- 前端开发总览
- 【Spring实战】—— 16 基于JDBC持久化的事务管理
- 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解
- 基于AngularJS的过滤与排序
- 【Spring实战】—— 5 设值注入
- 科学家预测:未来100万年人类将变成半机械人类
- 【Spring实战】—— 8 自动装配
- 【Spring实战】—— 7 复杂集合类型的注入
- 【Spring实战】—— 6 内部Bean
- 几款可替代Dreamweaver的HTML5开发工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RabbitMQ 消费端限流、TTL、死信队列
- 全栈必备 Redis基础
- JSP的异常处理
- (二)Mybatis-Plus的安装配置
- 如何在JSP里自定义标签
- 如何在JSP里使用Java bean
- 获取指定时间内指定星期几的所有日期
- 使用JSP的标准标签库JSTL处理XML格式的数据
- (一)初识Mybatis-Plus
- org.apache.tomcat.util.scan.StandardJarScanner找不到serializer.jar的问题
- JAVA中获取当前系统时间
- 使用Supervisor管理进程
- vue 中使用threejs
- 数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同
- 生成项目目录树