堆 (堆排序 删除元素 插入元素 寻找第k大、第k小元素)

#include <stdio.h>
int h[100],n;
void swap(int x,int y)   //交换两个元素 
{
	int temp;
	temp=h[x];
	h[x]=h[y];
	h[y]=temp;
}
void siftdownmin(int x)  //从x结点向下调整堆 生成小根堆 
{
	int flag=0,t;
	while(x*2<=n&&!flag)
	{
		if(h[x]>h[x*2])
		{
			t=x*2;
		}
		else
		{
			t=x;
		}
		if(x*2+1<=n&&h[t]>h[x*2+1])
		{
			t=x*2+1;
		}
		if(t!=x)
		{
			swap(x,t);
			x=t;	
		}
		else
			flag=1;
	}
}
void siftdownmax(int x)   //从x结点开始向下调整 生成大根堆 
{
	int flag=0,temp;
	while(x*2<=n&&!flag)
	{
		if(h[x]<h[x*2])
		{
			temp=x*2;
		 } 
		else
		{
			temp=x;
		}
		if(h[x]<h[x*2+1])
		{
			temp=x*2+1;
		}
		if(x!=temp)
		{
			swap(x,temp);
			x=temp;
		}
		else
		{
			flag=1;
		}
	}
}
void creatmin(int x)   //生成x个元素的小根堆 
{
	for(int i=x/2;i>=1;i--)
	{
		siftdownmin(i);
	}
 } 
void creatmax(int x)  //生成x个元素的大根堆 
{
	for(int i=x/2;i>=1;i--)
	{
		siftdownmax(i);
	 } 
}
void siftup(int x)  //插入x,并生成最小堆 
{
	h[++n]=x;
	int i=n,flag=0;
	while(i>1&&!flag)
	{
		if(h[i]<h[i/2])
		{
			swap(i,i/2);
			i/=2;
		}
		else
		{
			flag=1;
		}
	}
}
void delmin()
{
 	h[1]=h[n--]; //删除最小的数 
	siftdownmin(1); 
 } 
void delmax()  //删除最大的元素 
{
	h[1]=h[n--];
	siftdownmax(1);
}
int siftkmin(int k)
{                           //寻找第k大寻元素 
	creatmin(k);
	for(int i=k+1;i<=n;i++)
	{
		if(h[i]>h[1])
			{
				h[1]=h[i];
				creatmin(k);
			}
	 } 
	 return h[1];
}
int siftkmax(int k)
{
	creatmax(int k);
	while(int i=k+1;i<=n;i++)
	{
		if(h[i]<h[1])
		{
			h[1]=h[i];
			creatmax(k);
		}	
	}	
} 
void headsort()  //对x个元素进行堆排序 
{
	while(n--)
	{
		swap(1,n);
		siftdownmax(1);  //用大根堆 从小到大排序 
		//siftdownmin(1);  用小根堆 从大向小排序 
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&h[i]);
	}
	creatmin(n);   //生成小根堆 
	//creatmax(n); 生成大根堆
	 for(int i=1;i<=n;i++)
		printf("%d ",h[i]);
	
	return 0;
}
发布了31 篇原创文章 · 获赞 11 · 访问量 2572

猜你喜欢

转载自blog.csdn.net/guyjy/article/details/105019273