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;
}

时间: 2024-12-19 02:38:02

make_head,,,pop_head,,,push_head,,,sort_head..的相关文章

C++ 基本数据结构整理

Hash Map (Unordered_map) Insert #include <unordered_map> using namespace std; unordered_map <char, bool> hash_map; hash_map.insert(make_pair<char,bool>('a',true)); find if(hash_map.find(num) == hash_map.end()) cout << "not fou

经典算法题每日演练——第十九题 双端队列

原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in love,嗨,慢慢调整心态吧, 这篇就选一个简单的数据结构聊一聊,话说有很多数据结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是 栈和队列的组合体. 一:概念 我们知道普通队列是限制级的一端进,另一端出的FIFO形式,栈是一端进出的LIFO形式,而双端队列就没有这样的限制级,也就是我们可以在 队列两端进行

数据结构与算法笔试面试题整理

给出的一些常见的数据结构与算法的笔试面试题,特整理如下,后期遇到新的再更新. 笔试面试题 常见时空复杂度有 常数级复杂度:O(1) 对数级复杂度:O(logN) 线性级复杂度:O(N) 线性对数级复杂度:O(NlogN) 平方级复杂度:O(N2) 冒泡排序算法(重点) (1)算法流程 a.比较两个相邻的元素,如果第一个比第二个大,则交换两个元素的位置: b.对每一对相邻的元素做同样的工作,从开始的第一对一致到结尾的最后一对,经过这一步,最后的元素将是最大值: c.针对所有的元素重复以上步骤,除了

c++面试

 Bjarne Stroustrup的 C++ 风格与技术 FAQ(中文版) 1.尽可能说出static关键字的作用? (1) static修饰函数局部变量(包括main函数里的),该变量不会随着函数作用域的退出而销毁,而是只分配一次内存,下次调用时为上次调用的值. (2) static修饰全局变量,限定了该变量只能被本文件访问,不能被其他文件访问. (3) static修饰的函数只能被本文件访问,不能被其他文件访问. (4) static menber属于类,所有该类的实例对象共享一份拷贝(此

asp.net线程批量导入数据时通过ajax获取执行状态

最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过ajax调用session里的执行状态,从而实现反馈导入状态的功能! 上代码: 前端页面 <!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8

BZOJ1096 [ZJOI2007]仓库建设

蒟蒻就写一下简单题吧... 此题很容易写出dp的方程: 令f[i]表示i号点要建仓库的话最小总费用,则 f[i] = min(f[j]  + (x[i] - x[j + 1]) * p[i + 1] + (x[i] - x[j + 2])* p[i + 2] + ... + (x[i] - x[i]) * p[i]) + c[i] 然后把min里面的东西展开再合并,并且令 sp[i] = p[1] + p[2] + ... + p[i] s[i] = x[1] * p[1] + x[2] * p

网络编程-SOCKET开发

计算机基础知识 计算机分三层:应用程序. 操作系统.硬件.硬件是用来干活的,应用程序想要实现一定的功能就要调用硬件工作.但是如果每一个软件开发,都要写怎么操作硬件的代码,就会有大量重复的代码,而且十分复杂.因此,操作系统就出现了,操作系统相当于提供了一套接口,软件的功能通过操作系统,操作系统再让硬件工作.应用程序无法直接让硬件工作 只能间接地通过操作系统使硬件工作实现特定的功能. 作为应用开发程序员,我们开发的软件都是应用软件,而应用软件必须运行于操作系统之上,操作系统则运行于硬件之上, 应用软

C++ 双链表练习,实现球在屏幕中滚动,排坑

#include <stdio.h> #include <stdlib.h> #include <easyx.h> //定义一个双链表节点 struct Node { int x; //数据 int y; int z; Node* next; //下个数据 Node* last; //上个数据 }; //定义list存放node指针 struct List { int size; //存放node节点的大小 Node* head; //指针指向头节点 Node* tai