STL系列之四 heap 堆

2021-06-21 15:25:10 字數 2962 閱讀 9977

下面再介紹stl中與堆相關的4個函式——建立堆make_heap(),在堆中新增資料push_heap(),在堆中刪除資料pop_heap()和堆排序sort_heap():

標頭檔案 #include

下面的_first與_last為可以隨機訪問的迭代器(指標),_comp為比較函式(仿函式),其規則——如果函式的第乙個引數小於第二個引數應返回true,否則返回false。

建立堆

make_heap(_first, _last, _comp)

預設是建立最大堆的。對int型別,可以在第三個引數傳入greater()得到最小堆。

在堆中新增資料

push_heap (_first, _last)

要先在容器中加入資料,再呼叫push_heap ()

在堆中刪除資料

pop_heap(_first, _last)

要先呼叫pop_heap()再在容器中刪除資料

堆排序

sort_heap(_first, _last)

排序之後就不再是乙個合法的heap了

有關堆與堆排序的更詳細介紹請參閱——《

白話經典演算法系列之七 堆與堆排序》

下面給出stl中heap相關函式的使用範例:

[cpp]view plain

copy

//by morewindows(  )

#include 

#include 

#include 

#include 

using

namespace

std;  

void

printfvectorint(vector<

int> &vet)  

intmain()    

掌握其基本用法後,我們用這個堆排序和

《白話經典演算法系列》

中的堆排序

、快速排序

,歸併排序

來進行個效能測試(win7 + vs2008 release下),測試**如下:

[cpp]view plain

copy

// by morewindows(  )

#include 

#include 

#include 

using

namespace

std;  

//------------------------快速排序----------------------------

void

quick_sort(

ints, 

intl, 

intr)  

s[i] = x;  

quick_sort(s, l, i - 1); // 遞迴呼叫 

quick_sort(s, i + 1, r);  

}  }  

//------------------------歸併排序----------------------------

//將有二個有序數列a[first...mid]和a[mid...last]合併。

void

mergearray(

inta, 

intfirst, 

intmid, 

intlast, 

inttemp)  

while

(i <= m)  

temp[k++] = a[i++];  

while

(j <= n)  

temp[k++] = a[j++];  

for(i = 0; i 

a[first + i] = temp[i];  

}  void

mergesort(

inta, 

intfirst, 

intlast, 

inttemp)  

}  bool

mergesort(

inta, 

intn)  

//------------------------堆排序---------------------------

inline

void

swap(

int&a, 

int&b)  

//建立最小堆

//  從i節點開始調整,n為節點總數 從0開始計算 i節點的子節點為 2*i+1, 2*i+2

void

minheapfixdown(

inta, 

inti, 

intn)  

a[i] = temp;  

}  //建立最小堆

void

makeminheap(

inta, 

intn)  

void

minheapsorttodescendarray(

inta, 

intn)  

}  const

intmaxn = 5000000;  

inta[maxn];  

intb[maxn], c[maxn], d[maxn];  

intmain()    

對100000(十萬)個資料的測試結果:

對500000(五十萬)個資料的測試結果:

對1000000(一百萬)個資料的測試結果:

對5000000(五百萬)個資料的測試結果:

從中可以看出快速排序的效率確實要比其它同為o(n * logn)的排序演算法要高,而stl中堆操作函式的效能與《

白話經典演算法系列之七 堆與堆排序

》一文中堆操作函式的效能是相差無幾的。

STL系列之四 heap 堆

下面再介紹stl中與堆相關的4個函式 建立堆,新增資料,刪除資料,堆排序 標頭檔案 include 下面的 first與 last為可以隨機訪問的迭代器 指標 comp為比較函式 仿函式 其規則 如果函式的第乙個引數小於第二個引數應返回true,否則返回false。建立堆 make heap fir...

STL系列之四 heap 堆

下面再介紹stl中與堆相關的4個函式 建立堆make heap 在堆中新增資料push heap 在堆中刪除資料pop heap 和堆排序sort heap 標頭檔案 include 下面的 first與 last為可以隨機訪問的迭代器 指標 comp為比較函式 仿函式 其規則 如果函式的第乙個引數...

STL系列之四 heap 堆

下面再介紹stl中與堆相關的4個函式 建立堆make heap 在堆中新增資料push heap 在堆中刪除資料pop heap 和堆排序sort heap 標頭檔案 include 下面的 first與 last為可以隨機訪問的迭代器 指標 comp為比較函式 仿函式 其規則 如果函式的第乙個引數...