• 堆 (堆排序 删除元素 插入元素 寻找第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;
    }
    
  • 相关阅读:
    同步、异步、阻塞和非阻塞区别
    SpringMVC文件上传实现
    Java注解入门
    SpringMVC实现一个controller写多个方法
    提高tomcat的并发能力
    人一生追求的是什么
    python class对象转换成json/字典
    python可分组字典
    python enumerate函数用法
    Python特殊语法--filter、map、reduce、lambda
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14847986.html
Copyright © 2020-2023  润新知