heap相关算法的简单实现
// 12:06 PM/09/28/2017
#pragma once
//向下调整算法 主要用来make_heap 以及pop_heap
inline void adjustDown(int* heap, const int first, const int last)
{
if (last == first + )return;
int value = heap[first];
int hole = first;//当前要调整的节点
int childHole = hole * ;//其左子女节点
while (childHole < last)//当左子女节点存
{
if (childHole < last - && heap[childHole] < heap[childHole + ])//如果左右子女都存在
childHole++;
if (value > heap[childHole]) break; {
//当待调整元素 比子女元素小是,将子女元素移动到父节点
heap[hole] = heap[childHole];
hole = childHole;//将该子女元素设置为洞
childHole = hole * ;
}
}
heap[hole] = value;
} //像上调整 实际上也就是 pop_heap
inline void adjustUp(int* heap, const int first, const int last)
{
if (last == first + )return;
int hole = last - ;//最后一个元素设置为洞
int parentHole = hole / ;//该元素的父节点
int value = heap[last - ];//当前要调整元素
while (parentHole >= first && value > heap[parentHole])//父节点存在,且当前值大于父节点
{
heap[hole] = heap[parentHole];//父节点的值给当前洞
hole = parentHole;//父节点设置为洞
parentHole = hole / ;
}
heap[hole] = value;
} inline void push_heap(int* heap, const int firstIndex, const int lastIndex)
{
adjustUp(heap, firstIndex, lastIndex);
} //弹出最大元素
inline void pop_head(int* heap, const int firstIndex, const int lastIndex)
{
int value = heap[firstIndex];//要弹出的元素
heap[firstIndex] = heap[lastIndex - ];//把最后一个元素给要弹出的
heap[lastIndex - ] = value;//要弹出的放到最后
adjustDown(heap, firstIndex, lastIndex - );//进行向下调整
} inline void sort_heap(int* heap, int firstIndex, int lastIndex)
{
int curLast = lastIndex;
while (curLast > firstIndex)
{
pop_head(heap, firstIndex, curLast);
curLast--;
}
} inline void make_heap(int* heap, int firstIndex, int lastIndex)
{
int hole = (lastIndex - ) / ;
while (hole >= firstIndex)
{
adjustDown(heap, hole, lastIndex);
hole--;
}
} inline void partial_sort(int* heap, const int first, const int middle, const int last)
{
int i = middle;
make_heap(heap, first, middle);
while (i < last)
{
if (heap[i] < heap[first])
{
int value = heap[first];
heap[first] = heap[i];
heap[i] = value;
adjustDown(heap, first, middle);
}
i++;
}
sort_heap(heap, first, middle);
}
heap相关算法的简单实现的更多相关文章
- 【STL学习】堆相关算法详解与C++编程实现(Heap)
转自:https://blog.csdn.net/xiajun07061225/article/details/8553808 堆简介 堆并不是STL的组件,但是经常充当着底层实现结构.比如优先级 ...
- 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...
- [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...
- [java,2017-05-15] 内存回收 (流程、时间、对象、相关算法)
内存回收的流程 java的垃圾回收分为三个区域新生代.老年代. 永久代 一个对象实例化时 先去看伊甸园有没有足够的空间:如果有 不进行垃圾回收 ,对象直接在伊甸园存储:如果伊甸园内存已满,会进行一次m ...
- UCI机器学习库和一些相关算法(转载)
UCI机器学习库和一些相关算法 各种机器学习任务的顶级结果(论文)汇总 https://github.com//RedditSota/state-of-the-art-result-for-machi ...
- 采样方法(二)MCMC相关算法介绍及代码实现
采样方法(二)MCMC相关算法介绍及代码实现 2017-12-30 15:32:14 Dark_Scope 阅读数 10509更多 分类专栏: 机器学习 版权声明:本文为博主原创文章,遵循CC 4 ...
- 盘点十大GIS相关算法
1.道格拉斯-普克算法(Douglas–Peucker) 道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲 ...
- 带有两个输入字段和相关标记的简单 HTML 表单:
带有两个输入字段和相关标记的简单 HTML 表单: 意思就是说Male 和id="male"绑定在一起. <html> <body> <p> ...
- Linux IO调度器相关算法介绍(转)
IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...
随机推荐
- python 爬虫,网页转PDF:OSError: No wkhtmltopdf executable found
解决办法: 代码中设置参数: path_wk = r‘D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe‘ #wkhtmltopdf安装位置 config ...
- scrapy 源码解析 (五):启动流程源码分析(五) Scraper刮取器
Scraper刮取器 对ExecutionEngine执行引擎篇出现的Scraper进行展开.Scraper的主要作用是对spider中间件进行管理,通过中间件完成请求.响应.数据分析等工作. Scr ...
- Django框架04 /模板相关、别名/反向解析/路由分发
Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...
- tf.nn.conv2d函数和tf.nn.max_pool函数介绍
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) 介绍参数: input:指卷积需要输入的 ...
- 并发编程之关键字(synchronized、volatile)
并发编程主要设计两个关键字:一个是synchronized,另一个是volatile.下面主要讲解这两个关键字,并对这两个关机进行比较. synchronized synchronized是通过JMV ...
- someone you loved 歌词翻译
I'm going under and this time I fear there's no one to save me 我要放弃了,这一次我怕没有人可以拯救我. This all or noth ...
- p44_IP数据包格式
一.IP数据报格式 二.IP分片 数据链路层每帧可封装数据有上限,IP数据超过的要分片. 标识:同一数据报的分片使用同一标识 标志: 片偏移(13bit):用于还原数据报顺序,指出某片在原分组1中的相 ...
- 部署一套完整的Kubernetes高可用集群(二进制,v1.18版)
一.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm ...
- P4547 [THUWC2017]随机二分图(状压,期望DP)
期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应 ...
- 关于maven的一份小笔记
简介 项目里一直用的 maven,几乎天天和这个"熟知"的工具打交道,但是,最近我发觉自己对 maven 了解的还不够,例如,什么是 goal?什么是 phase?等等.趁着最近有 ...