STL 堆排序

C++ STL中提供了不少和排序相关的算法,包括堆排序(heap_sort)、排序(sort)、稳定排序(stable_sort)、局部排序(partial_sort),时间复杂度均为O(nlogn)。其中,对于堆排序,也提供了不少函数,像入堆push_heap、创建堆make_heap、出堆pop_heap,是否为堆is_heap等。首先要明确数据结构上堆的概念。对于一个迭代器区间上的元素,不管实际的数据结构如何,都可以逻辑上排成一个完全二叉树,如果树的每个父节点都不小于左右两个子节点,那么区间元素就构成了一个堆。例子很简单,算是科普性的。。。

入堆push_heap

入堆push_heap算法带有二元谓词判断comp,可以自行设定元素的大于或者小于关系,从而进一步确定创建的是大根堆还是小根堆。其函数原型对应两种,

template 
  void push_heap (RandomAccessIterator first, RandomAccessIterator last);

template 
  void push_heap (RandomAccessIterator first, RandomAccessIterator last,
                   Compare comp);


第一种方式默认创建的是大根堆。

Given a heap in the range [first,last-1),this function extends the range considered a heap to [first,last) by placingthe value in (last-1) into its corresponding location within it.

#include
#include
#include
using namespace std;
void print(int x)
{
	cout< v;
	v.push_back(38);
	v.push_back(11);
	v.push_back(15);
	v.push_back(39);
	v.push_back(60);
	v.push_back(55);
	v.push_back(20);
	v.push_back(26);
	make_heap(v.begin(),v.end());
	for_each(v.begin(),v.end(),print);
	cout<

创建堆make_heap

创建堆make_heap算法重新排列元素,使元素在逻辑上构成一个堆,默认是大根堆。函数原型有两种:

template 
  void make_heap (RandomAccessIterator first, RandomAccessIterator last);

template 
  void make_heap (RandomAccessIterator first, RandomAccessIterator last,
                  Compare comp );


 

Rearranges the elements in the range[first,last) in such a way that they form a heap.

#include
#include
#include
using namespace std;
void print(int x)
{
	cout< v;
	v.push_back(38);
	v.push_back(11);
	v.push_back(15);
	v.push_back(39);
	v.push_back(60);
	v.push_back(55);
	v.push_back(20);
	v.push_back(26);
	make_heap(v.begin(),v.end());
	for_each(v.begin(),v.end(),print);
	cout<


出堆pop_heap

相对于push_heappop_heap将元素进行出堆操作。

实现过程大概是这样的,将已经够成堆的迭代器区间中的最大值元素即根节点,移动到最后元素位置,原来的最后元素调整为根节点后,再对区间元素重新创建堆。

函数原型有两个:

 

template 
  void push_heap (RandomAccessIterator first, RandomAccessIterator last);
template 
  void push_heap (RandomAccessIterator first, RandomAccessIterator last,
                   Compare comp);


 

#include
#include
using namespace std;
void print(int x)
{
	cout<


 

堆排序sort_heap

利用堆进行排序,时间复杂度为O(nlogn)

 

#include 
#include 
#include 
using namespace std;

void print(int x){
	cout << x << ' ';
}

int main(void){
	vector v;
	v.push_back(3);
	v.push_back(9);
	v.push_back(6);
	v.push_back(3);
	v.push_back(12);
	v.push_back(17);
	v.push_back(20);
	for_each(v.begin(), v.end(), print); cout << endl;
	//建立堆
	make_heap(v.begin(), v.end());
	cout<<"创建堆,未排序之前"<


 

你可能感兴趣的:(STL,C++,STL,堆排序)