二叉树——堆排序

二叉树——堆排序

堆排序是指利用堆的性质,对数据进行排序。堆排序是一种高效率算法和快速排序的时间复杂度差不多。

排序分为升序和降序,本次说的是升序;

首先我们要创建一个堆,并将堆处理为最小堆(最小堆就是父亲节点的权值小于子节点的权值,最大堆则相反),由于堆的特性,最小堆的首节点的权值一定是最小值;然后我们利用这一特性可以实现对数据的排序。

#include 

int a[101];
int n;
void swap(int x,int y)//交换 
{
	int t;
	t=a[x];
	a[x]=a[y];
	a[y]=t;
	return ;
}
void siftdown(int i)//向下调整 
{
	int t,flag=0;
	while(i*2<=n&&flag==0)
	{
		if(a[i]>a[i*2])
			t=i*2;
		else
			t=i;
		if(i*2+1<=n)
		{
			if(a[t]>a[i*2+1])
				t=i*2+1;
		}
		if(t!=i)
		{
			swap(t,i);
			i=t;
		}
		else 
		 flag=1;
	}
	return ;
}
void creat()
{
	int i;
	for(i=n/2;i>=1;i--) 
		siftdown(i);
	return ;
}
int deletemax()//堆排序 
{
	int t;
	t=a[1];
	a[1]=a[n];
	n--;
	siftdown(1);
	return t; 
}
int main()
{
	int i,num;
	scanf("%d",&num);
	
	for(i=1;i<=num;i++)
		scanf("%d",&a[i]);
	n=num;
	creat();//建堆 
	
	for(i=1;i<=num;i++)
		printf("%d ",deletemax());
	
	return 0;
} 

 

你可能感兴趣的:(二叉树,排序)