堆排序

一、数组的堆化

堆的存储结构采用数组的形式,以大根堆为例(每个根结点值大于其子女的值)。堆数据在数组中的父子关系反映为第i个结点的父结点为(i-1)/2,其左子女(若有的话)下标为2*i+1,右子女(若有的话)为2*i+2。

void makebigheap(heaptree &htree,int a[],int n)
{
	htree.maxsize=2*n;
	htree.heapsize=n;
	htree.heap=new int[2*n];
	memcpy(htree.heap,a,n*sizeof(int));
	int i,tempnode,itemp,itempchild;

	for(i=(n-2)/2;i>=0;i--)
	{
		itemp=i;
		itempchild=2*itemp+1;
		tempnode=htree.heap[i];
		while(itempchild<htree.heapsize)
		{
			if(itempchild+1<htree.heapsize&&htree.heap[itempchild]<htree.heap[itempchild+1])
				itempchild++;
			if(htree.heap[itemp]>htree.heap[itempchild])
				break;
			htree.heap[itemp]=htree.heap[itempchild];
			htree.heap[itempchild]=tempnode;
			
			itemp=itempchild;
			itempchild=2*itempchild+1;
		}
		//htree.heap[(itempchild-1)/2]=tempnode;
	}
}
二、堆排序

堆的排序为依次删除根结点:每次删除根结点,然后将数组最后的结点设为根结点,然后调整整个堆,使之满足大根堆的关系,然后再重复删除,直到数组内的元素删除完毕。

void sortbigheap(heaptree &htree)
{
	int i=0;
	int ichild;
	int size=htree.heapsize;

	while(size>0)
	{
		cout<<htree.heap[0]<<" ";
		i=0;
		ichild=2*i+1;
		while(ichild<size)
		{
			if(ichild+1<size&&htree.heap[ichild]<htree.heap[ichild+1])
				ichild++;
			if(htree.heap[size-1]>htree.heap[ichild])
				break;
			htree.heap[i]=htree.heap[ichild];
			htree.heap[ichild]=htree.heap[size-1];
			i=ichild;
			ichild=2*ichild+1;
		}
		htree.heap[(ichild-1)/2]=htree.heap[size-1];
		size--;
	}
	//cout<<htree.heap[0];
	delete []htree.heap;
}

总的代码:
#include <iostream>
using namespace std;
struct heaptree
{
	int *heap;
	int heapsize,maxsize; //heapsize为实际存储的个数;maxsize为数组的总长度,大于heapsize(可以大的空间提供插入)
};
void makebigheap(heaptree &htree,int a[],int n);  // 将数组a进行堆化,数组的长度为n
void sortbigheap(heaptree &htree);   //进行堆排序
void main()
{
	heaptree htree;
	int *a;
	int i,n;
	cout<<"please input the number of heap:\n";
	cin>>n;
	a=new int[n];
	for(i=0;i<n;i++)
	{
		cout<<"please input a number:\n";
		cin>>a[i];
	}
	makebigheap(htree,a,n);
	cout<<"the result of heap_sort is:\n";
	sortbigheap(htree);
}


void makebigheap(heaptree &htree,int a[],int n)
{
	htree.maxsize=2*n;
	htree.heapsize=n;
	htree.heap=new int[2*n];
	memcpy(htree.heap,a,n*sizeof(int));
	int i,tempnode,itemp,itempchild;

	for(i=(n-2)/2;i>=0;i--)
	{
		itemp=i;
		itempchild=2*itemp+1;
		tempnode=htree.heap[i];
		while(itempchild<htree.heapsize)
		{
			if(itempchild+1<htree.heapsize&&htree.heap[itempchild]<htree.heap[itempchild+1])
				itempchild++;
			if(htree.heap[itemp]>htree.heap[itempchild])
				break;
			htree.heap[itemp]=htree.heap[itempchild];
			htree.heap[itempchild]=tempnode;
			
			itemp=itempchild;
			itempchild=2*itempchild+1;
		}
		//htree.heap[(itempchild-1)/2]=tempnode;
	}
}

void sortbigheap(heaptree &htree)
{
	int i=0;
	int ichild;
	int size=htree.heapsize;

	while(size>0)
	{
		cout<<htree.heap[0]<<" ";
		i=0;
		ichild=2*i+1;
		while(ichild<size)
		{
			if(ichild+1<size&&htree.heap[ichild]<htree.heap[ichild+1])
				ichild++;
			if(htree.heap[size-1]>htree.heap[ichild])
				break;
			htree.heap[i]=htree.heap[ichild];
			htree.heap[ichild]=htree.heap[size-1];
			i=ichild;
			ichild=2*ichild+1;
		}
		htree.heap[(ichild-1)/2]=htree.heap[size-1];
		size--;
	}
	//cout<<htree.heap[0];
	delete []htree.heap;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值