zoukankan      html  css  js  c++  java
  • 堆 (堆排序 删除元素 插入元素 寻找第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;
    }
    
  • 相关阅读:
    101. Symmetric Tree(js)
    100. Same Tree(js)
    99. Recover Binary Search Tree(js)
    98. Validate Binary Search Tree(js)
    97. Interleaving String(js)
    96. Unique Binary Search Trees(js)
    95. Unique Binary Search Trees II(js)
    94. Binary Tree Inorder Traversal(js)
    93. Restore IP Addresses(js)
    92. Reverse Linked List II(js)
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14847986.html
Copyright © 2011-2022 走看看