博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
make_head,,,pop_head,,,push_head,,,sort_head..
阅读量:4554 次
发布时间:2019-06-08

本文共 2749 字,大约阅读时间需要 9 分钟。

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

 

 

 

 

 

 

 

 

 

认真理解上面知识点,然后通过理解下面的程序来理解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;
}

 

转载于:https://www.cnblogs.com/13224ACMer/p/4423056.html

你可能感兴趣的文章
Trailing Zeroes (I) LightOJ - 1028(唯一分解 因子个数)
查看>>
洛谷题 P3366 【模板】最小生成树
查看>>
Farey Sequence POJ - 2478 (欧拉函数 前缀和)
查看>>
[kuangbin带你飞]专题六 最小生成树 B - Networking
查看>>
[kuangbin带你飞]专题十二 基础DP1 E - Super Jumping! Jumping! Jumping! HDU - 1087(不连续单调递增最长子序列的和)...
查看>>
[kuangbin带你飞]专题四 最短路练习 B( POJ 2253) Frogger(spfa)
查看>>
[kuangbin带你飞]专题六 最小生成树 A - Jungle Roads
查看>>
Codeforces Round #570 (Div. 3)B
查看>>
[kuangbin带你飞]专题五 并查集 B - The Suspects
查看>>
[kuangbin带你飞]专题一 简单搜索 E. Find The Multiple
查看>>
[kuangbin带你飞]专题四 最短路练习 C - Heavy Transportation (spfa)最大权值
查看>>
北京信息科技大学第十一届程序设计竞赛(重现赛)I
查看>>
bfs入门 (HDU - 1548)A strange lift
查看>>
[kuangbin带你飞]专题一 简单搜索 A棋盘问题
查看>>
北京信息科技大学第十一届程序设计竞赛(重现赛)B
查看>>
北京信息科技大学第十一届程序设计竞赛(重现赛)H
查看>>
Codeforces Round #572 (Div. 2) A.
查看>>
POJ - 3984 迷宫问题
查看>>
Codeforces Round #572 (Div. 2)B
查看>>
[kuangbin带你飞]专题一 简单搜索 C
查看>>