在STL中,有不少的排序函數模板供咱們調用,省去咱們本身編寫一些排序過程的麻煩。本文是一篇關於STL中堆排序的一個介紹。html
本文涉及的幾個函數以下:make_heap(), push_heap(), pop_heap(), is_heap(), sort_heap()。其中make_heap()用於構建一個堆(若是你對「堆」這個數據結構不瞭解,請先去學習有關「堆」數據結構的知識再來查看本文)ios
SGI STL中對make_heap()的聲明以下:數據結構
template <class RandomAccessIterator>dom
void make_heap(RandomAccessIterator first, RandomAccessIterator last);函數
template <class RandomAccessIterator, class StrictWeakOrdering>學習
void make_heap(RandomAccessIterator first, RandomAccessIterator last,spa
StrictWeakOrdering comp);.net
就是說make_heap()有兩個重載版本,事實上都差很少,都是指定一個須要處理的區間,第二個版本只不過是本身定義一個比較準則而已。默認(第一種)是以operator<來做爲比較準則的。htm
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()差很少,push_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()以前用一下能夠確保區間已經構成一個堆。
下面來看一個例子:
//Coded By 代碼瘋子
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
void print(int elem)
{
cout << elem << ' ';
}
int main()
{
vector<int> coll;
int n;
while(cin >> n && n)
{
coll.push_back(n);
}
make_heap(coll.begin(), coll.end());
cout << "After make_heap()" << endl;
for_each(coll.begin(), coll.end(), print);
cout << endl;
cin >> n;
coll.push_back(n);
push_heap(coll.begin(), coll.end());
cout << "After push_heap()" << endl;
for_each(coll.begin(), coll.end(), print);
cout << endl;
pop_heap(coll.begin(), coll.end());
cout << "After pop_heap()" << endl;
for_each(coll.begin(), coll.end(), print);
cout << endl;
cout << "coll.back() : " << coll.back() << endl;
coll.pop_back();
sort_heap(coll.begin(), coll.end());
cout << "After sort_heap()" << endl;
for_each(coll.begin(), coll.end(), print);
cout << endl;
return 0;
}
Copyed From 程序人生
Home Page:http://www.programlife.net
Source URL:http://www.programlife.net/stl-sort-heap.html