STL_算法_Heap算法(堆排)(精)
C++ Primer 学习中。
。
。
简单记录下我的学习过程 (代码为主)
/*****************************************
STL-算法--Heap算法
堆排序算法 (heapsort)
make_heap() //把容器内的数据做堆排序
push_heap() //向堆内放入元素
pop_heap() //删除堆顶元素
sort_heap() //把堆排还原成普通排序
*****************************************/
/**----------------------------------------------------------------------------------
make_heap(b,e) 9
make_heap(b,e,cp) / \
push_heap(b,e) 8 6
push_heap(b,e,cp) / \ / \
pop_heap(b,e) 7 7 5 5
pop_heap(b,e,cp) / \ / \ / \ /
sort_heap(b,e) 3 6 4 1 2 3 4
sort_heap(b,e,cp)
----------------------------------------------------------------------------------**/
/**------http://blog.csdn.net/u010579068------**/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<algorithm>
using namespace std; /*****************************************
STL-算法--Heap算法 堆排序算法 (heapsort)
make_heap() //把容器内的数据做堆排序
push_heap() //向堆内放入元素
pop_heap() //删除堆顶元素
sort_heap() //把堆排还原成普通排序 *****************************************/
/**----------------------------------------------------------------------------------
make_heap(b,e) 9
make_heap(b,e,cp) / \
push_heap(b,e) 8 6
push_heap(b,e,cp) / \ / \
pop_heap(b,e) 7 7 5 5
pop_heap(b,e,cp) / \ / \ / \ /
sort_heap(b,e) 3 6 4 1 2 3 4
sort_heap(b,e,cp)
----------------------------------------------------------------------------------**/
/*************************************************************************************
std::make_heap 全部排序容器适用 algorithm
--------------------------------------------------------------------------------------
template <class RandomAccessIterator>
void make_heap ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare>
void make_heap ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
//eg: *************************************************************************************/ /*************************************************************************************
std::push_heap 全部排序容器适用 algorithm
--------------------------------------------------------------------------------------
template <class RandomAccessIterator>
void push_heap ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare>
void push_heap ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
//eg: *************************************************************************************/ /*************************************************************************************
std::pop_heap 全部排序容器适用 algorithm
--------------------------------------------------------------------------------------
template <class RandomAccessIterator>
void pop_heap ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare>
void pop_heap ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
//eg: *************************************************************************************/ /*************************************************************************************
std::sort_heap 全部排序容器适用 algorithm
--------------------------------------------------------------------------------------
template <class RandomAccessIterator>
void sort_heap ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare>
void sort_heap ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
//eg: *************************************************************************************/ template<typename T>
void Print(T& V)
{
typename T::iterator iter=V.begin();
while(iter != V.end())
{
cout<<*iter++<<" ";
}
cout<<endl;
} int main()
{
vector<int> ivec;
for(int i=3;i<=7;++i)
ivec.push_back(i);
for(int i=5;i<=9;++i)
ivec.push_back(i);
for(int i=1;i<=4;++i)
ivec.push_back(i);
cout<<"原数据:";
Print(ivec); make_heap(ivec.begin(),ivec.end());//做最大堆排序,事实上还在vector容器内
cout<<"堆排后:";
Print(ivec); pop_heap(ivec.begin(),ivec.end());//删除最大堆,事实上是把数据放到最后了!
cout<<"删除后:";
Print(ivec);
ivec.pop_back(); pop_heap(ivec.begin(),ivec.end());//删除最大堆,事实上是把数据放到最后了。
cout<<"删除后:";
Print(ivec);
ivec.pop_back(); ivec.push_back(15);
cout<<"增加数据后:";
Print(ivec); push_heap(ivec.begin(),ivec.end());//放入最大堆,事实上是把新增加的数据。依照堆排增加堆内
cout<<"把最后一个数增加堆里:\n";
Print(ivec); sort_heap(ivec.begin(),ivec.end());//把堆排顺序。还原成一般的排序算法
cout<<"还原堆排顺序:\n";
Print(ivec); return 0;
}
/*****************************************
//Output:
原数据:3 4 5 6 7 5 6 7 8 9 1 2 3 4
堆排后:9 8 6 7 7 5 5 3 6 4 1 2 3 4
删除后:8 7 6 7 4 5 5 3 6 4 1 2 3 9
删除后:7 7 6 6 4 5 5 3 3 4 1 2 8
加入数据后:7 7 6 6 4 5 5 3 3 4 1 2 15
把最后一个数加入堆里:
15 7 7 6 4 6 5 3 3 4 1 2 5
还原堆排顺序:
1 2 3 3 4 4 5 5 6 6 7 7 15 *****************************************/
STL_算法_Heap算法(堆排)(精)的更多相关文章
- 排序算法C语言实现——冒泡、快排、堆排对比
对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) ...
- STL_常用的算法
STL_常用的算法 一.常用的查找算法 adjacent_find() adjacent_find(iterator beg, iterator end, _callback); 在iterator对 ...
- 数组第K小数问题 及其对于 快排和堆排 的相关优化比较
题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...
- 造轮子-Java泛型堆排
个人博客地址:http://kyle.org.cn/2018/03/13/heapsort/ Java实现泛型堆排算法,用于N个对象中选择最大或者最小的前M个,其中M<=N 类似于Mysql中o ...
- P1177 【模板】快速排序(学完归并和堆排之后的二更)
P1177 [模板]快速排序 不用说,连题目上都标了是一道模板,那今天就来对能用到的许多排序方式进行一个总结: 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理 ...
- 经典算法 BFPRT算法详解
内容: 1.原始问题 => O(N*logN) 2.BFPRT算法 => O(N) 1.原始问题 问题描述:给你一个整型数组,返回其中第K小的数 普通解法: 这道题可以利用 ...
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- 【啊哈!算法】算法7:Dijkstra最短路算法
上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...
随机推荐
- ES6重点知识点总结(2)
ES6重点知识点总结(2) call和apply的作用是什么?区别是什么? call和apply的功能基本相同,都是实现继承或者转换对象指针的作用: 唯一不通的是前者参数是罗列出来的,后者是存到数组中 ...
- 洛谷1387 二维dp 不是特别简略的题解 智商题
洛谷1387 dp题目,刚开始写的时候使用了前缀和加搜索,复杂度大概在O(n ^ 3)级别,感觉这么写还是比较对得起普及/提高-的难度的..后来看了题解区各位大神的题解,开始一脸mb,之后备受启发. ...
- mycat的配置和学习
1.mycat一共三个配置文件. 1)server.xml:配置逻辑库的名称访问的账号密码 <user name="root"> <property name=& ...
- POJ 2480
可以容易得知,F=sum(p*phi(n/p)).思路就断在这里了... 看过别人的,才知道如下: 由于gcd(i,n*m)=gcd(i,m)*gcd(i,n),所以gcd为积性函数.而积性函数之和为 ...
- [Gatsby] Install Gatsby and Scaffold a Blog
In this lesson, you’ll install Gatsby and the plugins that give the default starter the ability to t ...
- 【c语言】输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素
//旋转数组的最小数字 //题目:把一个数组最開始的若干个元素搬到数组的末尾.我们称之为数组的旋转. //输入一个递增排序的数组的一个旋转.输出旋转数组中的最小元素. //比如:数组{3.4,5,1, ...
- iOS 手势识别器概述
手势识别器 iOS 手势识别器(UIGestureRecognizer) 点击手势(UITapGestureRecognizer) 滑动手势(UISwipeGestureRecognizer) 旋转手 ...
- TCP、HTTP协议的RPC
TCP.HTTP协议的RPC 1.1 基于TCP协议的RPC 1.1.1 RPC名词解释 RPC的全称是Remote Process Call,即远程过程调用,RPC的实现包括客户端和服务端,即服务调 ...
- 时间处理工具类TimeUtil
转自:https://cnblogs.com/ityouknow/p/5662753.html 功能 Date与String之间的互相转换,以及一些特殊格式的时间字符串处理 代码 /** * 类名:T ...
- [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)
题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才. ...