经常看到找出一序列的数据中的最大或最小n位数。一般这都是用堆来实现。如果找出最大10位数,那么创建一个包含10个元素的最小堆,当插入一个元素,判断是否比堆顶元素大,如果大,那么就弹出堆顶元素,插入该元素,否则,忽略该元素。最大堆也是同样的思路。
但是每次都我们自己去创建一个堆,非常麻烦。stl中给我们提供了现成的函数。
make_heap();、pop_heap();、push_heap();、sort_heap();
void make_heap(first_pointer,end_pointer,compare_function);
一个参数是数组或向量的头指针,第二个向量是尾指针。第三个参数是比较函数的名字。在缺省的时候,默认是大跟堆。
void pop_heap(first_pointer,end_pointer,compare_function);
作用:pop_heap()不是真的把最大(最小)的元素从堆中弹出来。而是重新排序堆。它把first和last交换,然后将[first,last-1)的数据再做成一个堆。
void pushheap(first_pointer,end_pointer,compare_function);
作用:push_heap()假设由[first,last-1)是一个有效的堆,然后,再把堆中的新元素加进来,做成一个堆。
void sort_heap(first_pointer,end_pointer,compare_function);
作用是sort_heap对[first,last)中的序列进行排序。它假设这个序列是有效堆。(当然,经过排序之后就不是一个有效堆了)
例子:
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)//最小堆
{
return a>b;
}
void printData(int data[],int count)
{
int i=0;
for(i;i<count;++i)
cout<<data[i]<<" ";
cout<<endl;
}
void main()
{
int data[10]={1,10,2,5,4,7,6,9,8,3};
make_heap(&data[0],&data[10],cmp);
printData(data,10);
int input;
while(cin>>input)
{
if(inpu<=data[0])
continue;
pop_heap(&data[0],&data[10],cmp);
printData(data,10);
data[9]=input;//pop出的元素放在末尾
push_heap(&data[0],&data[10],cmp);//只是调整而已
printData(data,10);
sort_heap(&data[0],&data[10],cmp);
printData(data,10);
}
}