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算法(堆排)(精)的更多相关文章

  1. 排序算法C语言实现——冒泡、快排、堆排对比

    对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) ...

  2. STL_常用的算法

    STL_常用的算法 一.常用的查找算法 adjacent_find() adjacent_find(iterator beg, iterator end, _callback); 在iterator对 ...

  3. 数组第K小数问题 及其对于 快排和堆排 的相关优化比较

    题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...

  4. 造轮子-Java泛型堆排

    个人博客地址:http://kyle.org.cn/2018/03/13/heapsort/ Java实现泛型堆排算法,用于N个对象中选择最大或者最小的前M个,其中M<=N 类似于Mysql中o ...

  5. P1177 【模板】快速排序(学完归并和堆排之后的二更)

    P1177 [模板]快速排序 不用说,连题目上都标了是一道模板,那今天就来对能用到的许多排序方式进行一个总结: 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理 ...

  6. 经典算法 BFPRT算法详解

    内容: 1.原始问题     =>  O(N*logN) 2.BFPRT算法    => O(N) 1.原始问题 问题描述:给你一个整型数组,返回其中第K小的数 普通解法: 这道题可以利用 ...

  7. 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)

    插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...

  8. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  9. 【啊哈!算法】算法7:Dijkstra最短路算法

    上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...

随机推荐

  1. 开发微信小程序必须要知道的事

    为什么是小程序? 为什么我们会开发小程序呢?或许是因为工作需要,或许是源于自己的追求(来自名利的欲望),但我要说--这是一种缘分,很美好的缘分,很多年后还值得庆幸的缘分 小程序目前可以分为三个阶段 一 ...

  2. Python-基础-day5

    1.内置函数 2.文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open ...

  3. Null值操作

      1)NULL值写入的操作    create table j010(     id number(7),     name varchar2(20),     salary number(7,2) ...

  4. ASP.NET-model验证

    在ASP.NET的model中,可以定义下面的这种属性,来实现前台签证字符串 RegularExpression(@"(|.*(?=.{6,})(?=.*\d)(?=.*[a-zA-Z]). ...

  5. 记一次在广播(BroadcastReceiver)或服务(Service)里弹窗的“完美”实践

    事情是这样的,目前在做一个医疗项目,需要定时在某个时间段比如午休时间和晚上让我们的App休眠,那么这个时候在休眠时间段如果用户按了电源键点亮屏幕了,我们就需要弹出一个全屏的窗口去做一个人性化的提示,“ ...

  6. ubuntu下使用Nexus搭建Maven私服

    ubuntu下使用Nexus搭建Maven私服 1.私服简介: 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服, ...

  7. Oracle Table Function

    Oracle Table Function在Oracle9i时引入.完美的兼容了view和存储过程的长处: 应用举例: 1.Table()函数: set feedback off create or ...

  8. nodejs即时聊天

    一直想做一个即时聊天的应用,前几天看到了socket.io,感觉还不错.自己略加改动,感觉挺不错的.官网上给的样例非常easy,以下改进了一点,实现了历史消息的推送. demo地址:chat.code ...

  9. linux 下的文件搜索、可执行文件搜索

    1. whereis 与 which 速度快,只是模糊查询,例如查询 $ whereis mysql,则会将mysql, mysql.ini, mysql*所在的目录都找出来: whereis 查看的 ...

  10. Kettle的概念学习系列之Kettle是什么?(一)

    不多说,直接上干货! Kettle是什么? Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. Kettle 中文 ...