make_head,,,pop_head,,,push_head,,,sort_head..
STL中,有很多的排序函数模板供我们调用,省去我们自己编写一些排序过程的麻烦。本文是一篇关于STL中堆排序的一个介绍。
本文涉及的几个函数如下:make_heap(), push_heap(), pop_heap(), is_heap(), sort_heap()。其中make_heap()用于构建一个堆(如果你对“堆”这个数据结构不了解,请先去学习有关“堆”数据结构的知识再来查看本文)
SGI STL中对make_heap()的声明如下:
template <class RandomAccessIterator>
void make_heap(RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class StrictWeakOrdering>
void make_heap(RandomAccessIterator first, RandomAccessIterator last,
StrictWeakOrdering comp);
就是说make_heap()有两个重载版本,事实上都差不多,都是指定一个需要处理的区间,第二个版本只不过是自己定义一个比较准则而已。默认(第一种)是以operator<来作为比较准则的。
SGI STL中对push_heap()的声明如下:
template <class RandomAccessIterator>
void push_heap(RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class StrictWeakOrdering>
void push_heap(RandomAccessIterator first, RandomAccessIterator last,
StrictWeakOrdering comp);
形式和make_heap()差不多,pop_heap()用于将指定区间的最后一个元素加入堆中并使整个区间成为一个新的堆。注意前提是最后一个元素除外的所有元素已经构成一个堆。
SGI STL中对pop_heap()的声明如下:
template <class RandomAccessIterator>
void pop_heap(RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class StrictWeakOrdering>
inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last, trictWeakOrdering comp);
和push_heap()相反,pop_heap()用于弹出堆中的第一个元素,并把它放到区间的最后一个位置,然后重新将前面的元素构建成一个堆。
SGI STL中对is_heap()的声明如下:
template <class RandomAccessIterator>
bool is_heap(RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class StrictWeakOrdering>
inline bool is_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp)
is_heap()用于判断一个区间是否是一个堆。这个函数在push_heap()之前用一下可以确保区间已经构成一个堆。
Copyed From 程序人生
Home Page:http://www.programlife.net
Source URL:http://www.programlife.net/stl-sort-heap.html
认真理解上面知识点,然后通过理解下面的程序来理解head的用法,,,,,,,
经典例子模版《《《《《本人亲自实践,决无差错《《《《《柏旭《《
#include<algorithm>
#include<cstdio>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int i,number[20]= {29,23,20,22,17,15,26,51,19,12,35,40};
make_heap(number,number+12);
/// 结果是:51 35 40 23 29 20 26 22 19 12 17 15
for(i=0; i<12; i++)
printf("%d ",number[i]);
printf("\n");
make_heap(&number[0],&number[12],cmp);
/// 结果:12 17 15 19 23 20 26 51 22 29 35 40
for(i=0; i<12; i++)
printf("%d ",number[i]);
printf("\n");
///加入元素8
number[12]=8;
///加入后调整
push_heap(number,number+12+1,cmp);
for(i=0; i<13; i++)
printf("%d ",number[i]);
printf("\n");
///结果: 8 17 12 19 23 15 26 51 22 35 40 20
///弹出元素8
pop_heap(&number[0],&number[13],cmp);
for(i=0; i<13; i++)
printf("%d ",number[i]);
printf("\n");
///结果:12 17 15 19 23 20 26 51 22 29 35 40
sort_heap(&number[0],&number[12],cmp);
///结果不用说都知道是有序的了!
for(i=0; i<13; i++)
printf("%d ",number[i]);
return 0;
}
make_head,,,pop_head,,,push_head,,,sort_head..的更多相关文章
- C++ 基本数据结构整理
Hash Map (Unordered_map) Insert #include <unordered_map> using namespace std; unordered_map &l ...
- C++并发编程学习笔记
// // main.cpp // test1 // // Created by sofard on 2018/12/27. // Copyright © 2018年 dapshen. All ...
- STL之heap学习
C++标准库中的堆-heap make_heap函数,包括两个参数(begin(number),end(number)).(左闭右开) pop_heap函数,包括两个参数,起始位置和终止位置,将当前区 ...
- asp.net线程批量导入数据时通过ajax获取执行状态
最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入sessi ...
- asp.net 线程批量导入数据,ajax获取执行状态
最近做了一个批量导入功能,长时间运行,没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过a ...
- js2048小游戏
js2048小游戏,方格是怎么合并和移动的 index.html <html> <head> <meta charset="utf-8"> &l ...
- heap相关算法的简单实现
// 12:06 PM/09/28/2017 #pragma once //向下调整算法 主要用来make_heap 以及pop_heap inline void adjustDown(int* he ...
- stl_heap
学习一下stl_heap 下面的算法是根据stl源码重新整合一下,是为了方便理解 因为使用的迭代器,为了在给定的迭代器之间使用heap的一些方法, 内部通常用disHole来确定某个节点 dishol ...
随机推荐
- [C#]exchange发送,收件箱操作类
最近项目中需要用到exchange的操作,就参照msdn弄了一个简单的操作类.目前先实现了,发送邮件和拉取收件箱的功能,其他的以后在慢慢的添加. using Microsoft.Exchange.We ...
- Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识
目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...
- ansible-2添加公钥
该文章摘自:http://www.fwqtg.net/%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E5%B7%A5%E5%85%B7ansible%E5 ...
- Matlab最短路径问题记录
利用graphshortestpath 可以求最短路径,具体用法参考MATLAB帮助 S=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; %起始节点向量 E=[2 3 5 4 4 6 ...
- BZOJ4034 T2
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...
- newinstance和new有什么区别
用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩.可扩展,可重用等软件思想上解释了.Java中工厂模式经 ...
- sql注入实例分析
什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...
- 工匠若水 Android应用开发编译框架流程与IDE及Gradle概要
http://blog.csdn.net/yanbober/article/details/45306483 http://blog.csdn.net/yanbober/article/details ...
- 修改eclipse/MyEclipse中包的显示结构为树形
在右上边三角那里进去设置 选第一个是显示完整的包名,第二个显示的是树形结构,我们一般用第一种,如下图:
- char*和char []
1.char *s1 = "ssss"; 2.char s2[] = "bbbb"; 对于第一种,我是无法理解,无法想象字符串赋值给一个char类型的指针,查了 ...