当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ Algorithm sort_heap()用法及代码示例


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_heap()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。