make_head,,,pop_head,,,push_head,,,sort_head..

來源:互聯網
上載者:User

標籤:

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..

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.