STL系列之四 heap 堆

2021-06-01 20:13:12 字數 2708 閱讀 2652

下面再介紹stl中與堆相關的4個函式——建立堆,新增資料,刪除資料,堆排序:

標頭檔案 #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了

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

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

view plain

copy to clipboard

print?

//by morewindows(  )

#include 

#include 

#include 

#include 

using

namespace std;  

void printfvectorint(vector &vet)  

int main()    

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

《白話經典演算法系列》

中的堆排序

、快速排序

,歸併排序

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

view plain

copy to clipboard

print?

// by morewindows(  )

#include 

#include 

#include 

using

namespace std;  

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

void quick_sort(int s, int l, int r)  

s[i] = x;  

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

quick_sort(s, i + 1, r);  

}  

}  

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

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

void mergearray(int a, int first, int mid, int last, int temp)  

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(int a, int first, int last, int temp)  

}  

bool mergesort(int a, int n)  

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

inline

void swap(int &a, int &b)  

//建立最小堆

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

void minheapfixdown(int a, int i, int n)  

a[i] = temp;  

}  

//建立最小堆

void makeminheap(int a, int n)  

void minheapsorttodescendarray(int a, int n)  

}  

const

int maxn = 5000000;  

int a[maxn];  

int b[maxn], c[maxn], d[maxn];  

int main()     

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

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

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

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

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

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

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

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為比較函式 仿函式 其規則 如果函式的第乙個引數...

STL系列之四 heap 堆

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