数据结构 | 堆排序

#include	
#include
/*
template//方法1
void BuildHeap(T* pa,int size)	//建堆
{
	for(int i=size/2-1;i>=0;i--)	//从邻近叶子的第一个非叶子结点至根节点
		PercolateDown(pa,i,size);	//向下调整为堆
}

template
void PercolateDown(T* pa,int pos,int size)	//将[pos,size)范围内的数据向下调整为堆
{
	int p=pos,c=2*p+1;
	T temp=pa[p];
	while(cpa[c])	//取孩子结点中的最大值
			++c;
		if(temp>=pa[c])
			break;
		else
		{
			pa[p]=pa[c];//孩子结点大就向上移动
			p=c;c=2*p+1;	//向下循环
		}
	}
	pa[p]=temp;
}

template
void HeapSort1(T* pa,int n)		//堆排序
{
	T temp;
	BuildHeap(pa,n);	//建大根堆
	for(int i=n-1;i>0;i--)
	{
		temp=pa[0];			//首尾交换
		pa[0]=pa[i];
		pa[i]=temp;
		PercolateDown(pa,0,i);//将[pos,size)范围内的数据向下调整为堆
	}
}
*/
template//方法2
void PercolateUp(T* pa,int pos)		//从下标为pos的元素开始向上调整为堆
{
	int c=pos,p=(c-1)/2;
	T temp=pa[c];
	while(c>0)
		if(pa[p]>temp)
			break;
		else
		{
			pa[c]=pa[p];	//小就下移
			c=p;p=(c-1)/2;	//向上循环
		}
	pa[c]=temp;
}
template		//将[0,size)范围内的数据向下调整为堆
void PercolateDown(T* pa,int size)
{
	int p=0,c=2*p+1;
	T temp=pa[p];
	while(cpa[c])
			++c;
		if(temp>pa[c])
			break;
		else
		{
			pa[p]=pa[c];	//大就上移
			p=c;c=2*p+1;	//向下循环
		}
	}
	pa[p]=temp;
}
template
void BuildHeap(T* pa,int size)	//从第2个元素开始向上调整为堆
{
	for(int i=1;i
void HeapSort2(T* pa,int n)
{
	BuildHeap(pa,n);
	T temp;
	for(int i=n-1;i>0;i--)
	{
		temp=pa[0];			//首尾交换
		pa[0]=pa[i];
		pa[i]=temp;
		PercolateDown(pa,i);//将[0,i)范围内的数据向下调整为堆
	}
}

int main()
{
	int a[10]={7,6,5,4,3,2,1,9,8,10};
//	HeapSort1(a,10);//方法1
	HeapSort2(a,10);//方法2
	for(int i=0;i<10;i++)
		cout<& vt):array(vt.Size()+10),size(vt.Size())
{
	for(int i=0;i=0;i--)
		PercolateDown(i);
}

 

数据结构 | 堆排序_第1张图片

 

你可能感兴趣的:(数据结构,数据结构,算法)