C++算法sort_heap()函數用於將一個堆[first, last)按升序轉換成一個排序的範圍。
第一個版本使用 operator< 比較元素,第二個版本使用給定的二進製比較函數 comp 比較元素。
用法
default (1) template <class RandomAccessIterator>
void sort_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2) template <class RandomAccessIterator, class Compare>
void sort_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
參數
first:指向目標堆中第一個元素的隨機訪問迭代器。
last:一個隨機訪問迭代器,指向目標堆中過去的最後一個元素。
comp: 一個用戶定義的二元謂詞函數,它接受兩個參數,如果兩個參數按順序返回真,否則返回假。它遵循嚴格的弱排序來對元素進行排序。
返回值
空
複雜度
複雜性在 first 和 last 之間的距離上達到線性:最多對元素執行 N*log (N) 次比較,並且最多執行 N = last - first 的許多元素交換或移動。
數據競爭
範圍 [first, last) 中的一些對象被修改。
異常
如果任何元素比較、元素交換(或移動)或迭代器上的操作引發異常,則此函數將引發異常。
注意:無效的參數會導致未定義的行為。
例子1
讓我們看一個簡單的例子來演示使用默認版本的 sort_heap() 的使用:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int a[] = {11, 22, 36, 17, 3, 25, 1, 2, 7};
vector<int> v(a, a+9);
cout <<"\nHere are the values in the heap:\n";
for (vector<int>::size_type i=0; i<v.size(); i++)
cout <<v.at(i)<<" ";
cout <<"\nNow we sort these values into ascending order.";
sort_heap(v.begin(), v.end());
cout <<"\nHere is the result:\n";
for (vector<int>::size_type i=0; i<v.size(); i++)
cout <<v.at(i)<<" ";
return 0;
}
輸出:
Here are the values in the heap: 11 22 36 17 3 25 1 2 7 Now we sort these values into ascending order. Here is the result: 1 2 3 7 17 22 25 36 11
例子2
讓我們看另一個簡單的例子來演示使用比較函數的 sort_heap() 的使用:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
int a[] = {11, 12, 15, 17, 13, 100, 36, 19};
vector<int> v(a, a+9);
cout <<"\nHere are the values in the heap:\n";
for (vector<int>::size_type i=0; i<v.size(); i++)
cout <<v.at(i)<<" ";
cout <<"\nNow we sort these values into descending order.";
sort_heap(v.begin(), v.end(), greater<int>());
cout <<"\nHere are the results:\n";
for (vector<int>::size_type i=0; i<v.size(); i++)
cout <<v.at(i)<<" ";
return 0;
}
輸出:
Here are the values in the heap: 11 12 15 17 13 100 36 19 0 Now we sort these values into descending order. Here are the results: 100 36 19 17 15 13 12 0 11
例子3
讓我們看另一個簡單的例子:
#include <iostream> // cout
#include <algorithm> // make_heap, pop_heap, push_heap, sort_heap
#include <vector> // vector
using namespace std;
int main () {
int myints[] = {10,20,30,5,15};
vector<int> v(myints,myints+5);
make_heap (v.begin(),v.end());
cout << "initial max heap :" << v.front() << '\n';
pop_heap (v.begin(),v.end()); v.pop_back();
cout << "max heap after pop:" << v.front() << '\n';
v.push_back(99); std::push_heap (v.begin(),v.end());
cout << "max heap after push:" << v.front() << '\n';
sort_heap (v.begin(),v.end());
cout << "final sorted range:";
for (unsigned i=0; i<v.size(); i++)
cout << ' ' << v[i];
cout << '\n';
return 0;
}
輸出:
initial max heap :30 max heap after pop:20 max heap after push:99 final sorted range:5 10 15 20 99
示例 4
讓我們看一個簡單的例子:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iomanip>
using namespace std;
void print(const vector <int>& v)
{
vector <int>::const_iterator i;
for(i = v.begin(); i != v.end(); i++)
{
cout << *i << " ";
}
cout << endl;
}
int main()
{
int arr[] = {10, 20, 40, 80, 160, 320};
vector<int> v(arr, arr + sizeof(arr) / sizeof(int));
cout << "Vector" << setw(4) << ":";
print(v);
// default make_heap creates max-heap
make_heap(v.begin(), v.end());
cout << "Heap" << setw(6) << ":";
print(v);
sort_heap(v.begin(), v.end());
cout << "Sorted" << setw(4) << ":";
print(v);
sort_heap(v.begin(), v.end(), greater<int>());
cout << "Reverse" << setw(3) << ":";
print(v);
return 0;
}
輸出:
Vector :10 20 40 80 160 320 Heap :320 160 40 80 20 10 Sorted :10 20 40 80 160 320 Reverse:320 160 80 40 20 10
相關用法
- C++ Algorithm sort()用法及代碼示例
- C++ Algorithm set_union()用法及代碼示例
- C++ Algorithm set_intersection()用法及代碼示例
- C++ Algorithm set_difference()用法及代碼示例
- C++ Algorithm stable_sort()用法及代碼示例
- C++ Algorithm stable_partition()用法及代碼示例
- C++ Algorithm set_symmetric_difference()用法及代碼示例
- C++ Algorithm swap_ranges()用法及代碼示例
- C++ Algorithm shuffle()用法及代碼示例
- C++ Algorithm remove_if()用法及代碼示例
- C++ Algorithm remove()用法及代碼示例
- C++ Algorithm max_element()用法及代碼示例
- C++ Algorithm next_permutation()用法及代碼示例
- C++ Algorithm upper_bound()用法及代碼示例
- C++ Algorithm minmax()用法及代碼示例
- C++ Algorithm remove_copy_if()用法及代碼示例
- C++ Algorithm random_shuffle()用法及代碼示例
- C++ Algorithm pop_heap()用法及代碼示例
- C++ Algorithm replace()用法及代碼示例
- C++ Algorithm lower_bound()用法及代碼示例
注:本文由純淨天空篩選整理自 C++ Algorithm sort_heap()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。