日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆以及stl堆的使用

發(fā)布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆以及stl堆的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概念

性質(zhì): 1.堆是一顆完全二叉樹,用數(shù)組實現(xiàn)。?
???2.堆中存儲數(shù)據(jù)的數(shù)據(jù)是局部有序的。

最大堆:1.任意一個結(jié)點存儲的值都大于或等于其任意一個子結(jié)點中存儲的值。?
?????2.根結(jié)點存儲著該樹所有結(jié)點中的最大值。

最小堆:1.任意一個結(jié)點存儲的值都小于或等于其惹你一個子結(jié)點存儲的值。?
?????2.根結(jié)點存儲著該樹所有結(jié)點中的最小值。

無論最小堆還是最大堆,任何一個結(jié)點與其兄弟結(jié)點之間都沒有必然聯(lián)系。

?

STL中并沒有把heap作為一種容器組件,heap的實現(xiàn)亦需要更低一層的容器組件(諸如list,array,vector)作為其底層機(jī)制。Heap是一個類屬算法,包含在algorithm頭文件中。雖然STL中關(guān)于heap默認(rèn)調(diào)整成的是大頂堆,但卻可以讓用戶利用自定義的compare_fuction函數(shù)實現(xiàn)大頂堆或小頂堆。heap的低層機(jī)制vector本身就是一個類模板,heap基于vector便實現(xiàn)了對各種數(shù)據(jù)類型(無論基本數(shù)據(jù)類型還是用戶自定義的數(shù)據(jù)類型)的堆排(前提是用戶自定義的數(shù)據(jù)類型要提供比較機(jī)制compare_fuction函數(shù))。

STL里面的堆操作一般用到的只有4個。


他們就是

make_heap();、pop_heap();、push_heap();、sort_heap();

他們的頭函數(shù)是algorithm

首先是make_heap();

他的函數(shù)原型是:

void make_heap(first_pointer,end_pointer,compare_function);

一個參數(shù)是數(shù)組或向量的頭指針,第二個向量是尾指針。第三個參數(shù)是比較函數(shù)的名字
。在缺省的時候,默認(rèn)是大跟堆。(下面的參數(shù)都一樣就不解釋了)

作用:把這一段的數(shù)組或向量做成一個堆的結(jié)構(gòu)。范圍是(first,last)

然后是pop_heap();

它的函數(shù)原型是:

void pop_heap(first_pointer,end_pointer,compare_function);

作用:pop_heap()不是真的把最大(最小)的元素從堆中彈出來。而是重新排序堆。它
把first和last交換,然后將[first,last-1)的數(shù)據(jù)再做成一個堆。

接著是push_heap()

void pushheap(first_pointer,end_pointer,compare_function);

作用:push_heap()假設(shè)由[first,last-1)是一個有效的堆,然后,再把堆中的新元素加
進(jìn)來,做成一個堆。

最后是sort_heap()

void sort_heap(first_pointer,end_pointer,compare_function);

作用是sort_heap對[first,last)中的序列進(jìn)行排序。它假設(shè)這個序列是有效堆。(當(dāng)然
,經(jīng)過排序之后就不是一個有效堆了)

#include<algorithm> #include<cstdio> using namespace std; bool cmp(int a,int b) //比較函數(shù) { return a>b; } int main() { int i,number[20]={29,23,20,22,17,15,26,51,19,12,35,40}; make_heap(&number[0],&number[12]); //結(jié)果是: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); //結(jié)果: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; //加入后調(diào)整 push_heap(&number[0],&number[13],cmp); //結(jié)果:8 17 12 19 23 15 26 51 22 35 40 20 for(i=0;i<13;i++) printf("%d ",number[i]); printf("\n"); //彈出元素8 pop_heap(&number[0],&number[13],cmp); //結(jié)果:12 17 15 19 23 20 26 51 22 29 35 40 for(i=0;i<13;i++) printf("%d ",number[i]); printf("\n"); sort_heap(&number[0],&number[12],cmp); //結(jié)果不用說都知道是有序的了! for(i=0;i<12;i++) printf("%d ",number[i]); return 0; }

  

轉(zhuǎn)載于:https://www.cnblogs.com/inception6-lxc/p/8483845.html

總結(jié)

以上是生活随笔為你收集整理的堆以及stl堆的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。