最大二叉堆的建立以及最大堆排序

//最大二叉堆实际上就是一个顺序数组,这个数组遵循这样的规律:若将数组按顺序写成二叉树的形式,则除根节点外,树中节点不大于其父节点

#include "stdafx.h"

	//二叉堆的建立
	//先将输入序列排序成二叉堆的形式


	template<class T>
void max_heapify(vector<T>& vec,int i,int heap_size)
{
	int l=2*i;
	int r=2*i+1;
	int largest;
	if(l<=heap_size-1&&vec[l]>vec[i])
		largest=l;
	else
		largest=i;
	if(r<=heap_size-1&&vec[r]>vec[largest])
		largest=r;
	if(largest!=i)
	{
		swap(vec[i],vec[largest]);
		max_heapify(vec,largest,heap_size);
	}
}

template<class T>
void build_max_heap(vector<T>& vec)
{
	int heap_size=vec.size();
	for(int i=vec.size()/2-1;i>=0;--i)
	{
		max_heapify(vec,i,heap_size);
	}
}

template<class T>
void heap_sort(vector<T>& vec)
{
	int heap_size=vec.size();
	build_max_heap(vec);
	for(int i=vec.size()-1;i>=1;--i)
	{
		swap(vec[i],vec[0]);
		--heap_size;
		max_heapify(vec,0,heap_size);
	}
}


int main()
{
	vector<int> ivec;
	for(int i=0;i<10;++i)
	{
		int n=rand()%10;
		ivec.push_back(n);		
	}
	cout<<"before sort"<<endl;
	for(vector<int>::iterator iter=begin(ivec);iter!=end(ivec);++iter)
	{
		cout<<*iter<<" ";
	}
	cout<<endl;
	build_max_heap(ivec);
	cout<<"after heapify"<<endl;
	for(vector<int>::iterator iter=begin(ivec);iter!=end(ivec);++iter)
	{
		cout<<*iter<<" ";
	}
	cout<<endl;
	heap_sort(ivec);
	cout<<"after heap_sort"<<endl;
	for(vector<int>::iterator iter=begin(ivec);iter!=end(ivec);++iter)
	{
		cout<<*iter<<" ";
	}



	cout<<endl;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值