標籤:
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;
}
make_head,,,pop_head,,,push_head,,,sort_head..