堆以及stl堆的使用

概念

性質: 1.堆是一顆完全二叉樹,用數組實現。?
???2.堆中存儲數據的數據是局部有序的。

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

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

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

?

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

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


他們就是

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

他們的頭函數是algorithm

首先是make_heap();

他的函數原型是:

void make_heap(first_pointer,end_pointer,compare_function);

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

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

然后是pop_heap();

它的函數原型是:

void pop_heap(first_pointer,end_pointer,compare_function);

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

接著是push_heap()

void pushheap(first_pointer,end_pointer,compare_function);

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

最后是sort_heap()

void sort_heap(first_pointer,end_pointer,compare_function);

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

#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[0],&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[0],&number[13],cmp);  //結果: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);  //結果: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);  //結果不用說都知道是有序的了!  for(i=0;i<12;i++)  printf("%d ",number[i]);  return 0;  }  

  

轉載于:https://www.cnblogs.com/inception6-lxc/p/8483845.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453384.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

讀【36歲IT老人再次隨筆】的讀后感,你會哪些計算機語言?

論壇首頁一篇&#xff1a;社區“揭穿最大謊言”事件 &#xff0c; 我看了&#xff0c;也順便看了里面另一位仁兄的【36歲IT老人再次隨筆】 其中關鍵的地方就是一個例子&#xff1a;你會哪些計算機語言&#xff1f; 這個問題很有意思&#xff0c;確實如網友回復里說到的&#xf…

php接收vue請求數據axios,詳解vue axios用post提交的數據格式

Content-type的幾種常見類型一、是什么&#xff1f;是Http的實體首部字段&#xff0c;用于說明請求或返回的消息主體是用何種方式編碼&#xff0c;在request header和response header里都存在。二、幾個常用類型&#xff1a;1、application/x-www-form-urlencoded這應該是最常見…

數據結構中的邏輯結構簡介

數據的邏輯結構是對數據之間關系的描述&#xff0c;有時就把邏輯結構簡稱為數據結構。邏輯結構形式地定義為&#xff08;K&#xff0c;R&#xff09;&#xff08;或&#xff08;D&#xff0c;S&#xff09;&#xff09;&#xff0c;其中&#xff0c;K是數據元素的有限集&#x…

applicationContext配置文件模板1

<?xml version"1.0" encoding"utf-8"?> <beans      --整個配置文件的根節點&#xff0c;包含一個或多個bean元素 xmlns    --最基本的命名空間定義 xmlns:xsi  --最基本的命名空間定義 xmlns:context  --啟動自動掃描或注解裝配…

時間復雜度的一些計算規則

一些規則(引自&#xff1a;時間復雜度計算 ) 1) 加法規則 T(n,m) T1(n) T2(n) O (max ( f(n),g(m) ) 2) 乘法規則 T(n,m) T1(n) * T2(m) O (f(n) * g(m)) 3) 一個特例&#xff08;問題規模為常量的時間復雜度&#xff09; 在大O表示法里面有一個特例&#xff0c;如…

職場新人面試誤區:我的技術好,所以你必須要請我?

這個是論壇的一個帖子。 前幾天有家軟件公司聯系到我&#xff0c;去之前電話里跟他們的項目經理聊了兩句&#xff0c;什么都明白了就沒去面試 是老板先給我打的電話&#xff0c;問我做J2EE多久了&#xff0c;期望薪水什么個范圍。。。 然后老板說&#xff0c;你稍等&#xff…

Oracle 基礎

為什么80%的碼農都做不了架構師&#xff1f;>>> Oracle DB筆錄&#xff0c;以后會不斷Add&#xff0c;歡迎留言補充! --cmd.exe(你懂得!) --[1]多個數據庫實例&#xff0c;切換選擇DB后&#xff0c;登錄操作 set ORACLE_SIDorcl --選擇DB orcl(你的DB實例名) --可在…

Linux執行命令提示Password,linux expect遠程自動登錄以及執行命令

linux遠程自動登錄以及執行命令遠程登錄該自動登錄的過程是通過shell里面expect實現的&#xff0c;類似相當于開了一個類似于cmd的命令段輸出IP和密碼。注意該腳本能夠執行的前提是安裝了expectyum install -y expect直接上腳本&#xff1a;#!/usr/bin/expect …

雙塔

## 雙塔 題目描述 有n個數字&#xff0c;要求將這n個數字分成兩部分&#xff08;兩部分可以數字個數不同&#xff09;&#xff0c;使得兩部分數字之和的差最小 輸入輸出格式 輸入&#xff1a; 第一行為n 第二行有n個數&#xff0c;即題目中所描述那樣 輸出&#xff1a; 兩部分和…

時間復雜度計算雜記

算法時間復雜度的計算 [整理] 時間復雜度算法 基本的計算步驟 時間復雜度的定義 一般情況下&#xff0c;算法中基本操作重復執行的次數是問題規模n的某個函數&#xff0c;用T(n)表示&#xff0c;若有某個輔助函數f(n)&#xff0c;使得當n趨近于無窮大時&#xff0c;T(n)/f(n…

MyBatis 在xml文件中處理大于號小于號的方法

為什么80%的碼農都做不了架構師&#xff1f;>>> 第一種方法&#xff1a;用轉義字符&#xff08;注&#xff1a;對大小寫敏感&#xff01; &#xff09; 用了轉義字符把>和<替換掉&#xff0c;然后就沒有問題了。 SELECT * FROM test WHERE 1 1 AND start_da…

linux 進程間讀寫鎖,Linux系統編程—進程間同步

我們知道&#xff0c;線程間同步有多種方式&#xff0c;比如&#xff1a;信號量、互斥量、讀寫鎖&#xff0c;等等。那進程間如何實現同步呢&#xff1f;本文介紹兩種方式&#xff1a;互斥量和文件鎖。##互斥量mutex我們已經知道了互斥量可以用于在線程間同步&#xff0c;但實際…

程序員:開汽車,難道我要知道汽車的原理才能把車開好嗎?

一個網友的迷惑&#xff1a; 我工作&#xff15;年了&#xff0c;一直做&#xff2a;&#xff12;&#xff25;&#xff25;的項目&#xff0c;前幾天去面試&#xff0c;一個人問我JDBC有幾種連接方式&#xff0c;這個問題這么多年以來我從來沒有遇見過&#xff0c;不知道大家 …

杭州某知名xxxx公司急招大量java以及大數據開發工程師

因公司戰略以及業務拓展&#xff0c;收大量java攻城獅以及大數據開發攻城獅. 職位信息&#xff1a; java攻城獅: https://job.cnblogs.com/offer/56032 大數據開發攻城獅: https://job.cnblogs.com/offer/56033 歡迎博客園的XDJM自薦和推薦&#xff01; 此招聘長期有效 歡迎留言…

35.6. /etc/dnsmasq.d/dnsmasq.address.conf

vim /etc/dnsmasq.d/dnsmasq.address.confaddress/www.mydomain.com/172.16.0.254deny domain address/www.facebook.com/127.0.0.1 address/www.google.com/127.0.0.135.6.1. 域名劫持 將域名解析到錯誤的地址&#xff0c;這樣可以屏蔽一些網站。 address/www.facebook.com/12…

請求地址操作中的(int*)

例如 float b3.14,*a&b; int *p(int *)a; 表示將指針a的類型轉換為整型指針再賦給p。

linux初始化內存盤卡住,Linux系統內存磁盤初始化技術詳細解析

轉自&#xff1a;http://m.zol.com.cn/article/1271270.html?viaindexLinux內存初始化技術(initrd)用于支持兩階段的系統引導過程&#xff0c;是在系統啟動過程中被掛載的臨時root文件系統(譯者注&#xff1a;這里的root文件系統是指的根文件系統)。initrd包含很多可執行程序和…

程序員是程序中的臨時變量,用完扔掉?

今天看到某人從墳墓里刨出的文章&#xff0c;挺有意思的。 程序員&#xff0c;到了一定年齡&#xff0c;如果沒有機會轉到領導級&#xff0c;至少是項目經理&#xff0c;能獨立領導團隊完成項目&#xff0c;還是停留在編碼的層次&#xff0c;那么被迫離開的危險會是很高的&…

屬性依賴注入

1.依賴注入方法 手動裝配和自動裝配 2.手動裝配 2.1 基于xml裝配 2.1.1 構造方法 <!-- 構造方法注入<constructor-arg>name:參數名type:類型value: --> <bean id"user" class"g_xml.constructor.User"><constructor-arg name"id…

windows下實現自己的第一個python腳本文件并.exe運行

前言 python可以做很多事情&#xff0c;比如知乎上的回答&#xff0c;每天來到公司都要打開AS&#xff0c; QQ和微信,為了省事決定用python寫一個簡單的腳本來實現。。腳本內容只有幾行,python的代碼真的好簡潔。。。 import os os.startfile("C:\Program Files (x86)\Ten…