优先级队列

分为最小优先级队列和最大优先级队列。

优先级队列是一种用来维护一组元素构成的集合s的数据结构,这一组元素都有一个关键字key,一个最大优先级队列支持的操作:

insert(s,x);把x插入到集合s中

maxmum(s);返回s中最大元素

extra_max(s);去掉s中最大关键字并返回该最大关键子

increase_key(s,x,k);将元素x的关键字的值增加到k,这里k的值不小于x的关键字。

#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
int n;
void max_heapify(int *v,int i);
void  heapsort();
void build_max_heap(int *v)
{  for(int i=n/2;i>0;--i)
    max_heapify(v,i);
}

void input(int *v)
{  
	 cin>>n;
     v[0]=0;//标志位
	 cout<<"please input array element:"<<endl;
   for(int i=1;i<=n;++i)
	   cin>>v[i];
   build_max_heap(v);

}
void output(int *v)
{  for(int i=0;i<=n;++i)
     cout<<v[i]<<" ";
     cout<<endl;
 }
void max_heapify(int *v,int i)//递归算法
{   int heap_size=n;
    int l=i<<1,r=(i<<1)+1,largest=i;
	if(l<=heap_size&&v[l]>v[largest]) largest=l;
	if(r<=heap_size&&v[r]>v[largest]) largest=r;
	if(i!=largest)
	{  int temp=v[i];
	   v[i]=v[largest];
	   v[largest]=temp;
       max_heapify(v,largest);
	}
	
}
void max_heapify_effective(int *v,int i)//非递归算法
{int heap_size=n;
   while(i<=n)
   {   int largest=i;
	   int l=i<<1,r=(i<<1)+1;
      if(l<=heap_size&&v[l]>v[largest]) largest=l;
	 if(r<=heap_size&&v[r]>v[largest]) largest=r;
	 if(i!=largest)
	 {  int temp=v[i];
	    v[i]=v[largest];
	    v[largest]=temp;
        i=largest;
	 }
     else break;
   }
   
}
void heap_increase_key(int *v,int i,int key)//将堆中位置为i的元素改为key并保持最大堆的性质
{    
	if(key<v[i]){v[i]=key; max_heapify(v,i);}
	else{   v[i]=key;
		 while(i>1&&v[i/2]<v[i])
         {   int temp=v[i];
             v[i]=v[i/2];
	         v[i/2]=temp;
		     i=i/2;
	   }
	}
}
void max_heap_insert(int *v,int key)//向堆中插入一个元素
{      n++;
      v[n]=-0xfff;
	heap_increase_key(v,n,key);
 }
int heap_extra_max(int *v)//去掉并返回堆中最大元素
{ if(n<1) return 0;
  int max=v[1];
   v[1]=v[n];
   n--;
   max_heapify(v,1);
   return max;
 }
void heapsort(int *v)//堆排序
{ int m=n;
  for(int i=m;i>1;--i)
   {  int temp=v[i];
       v[i]=v[1];
	   v[1]=temp;
	   n--;
	   max_heapify(v,1);
   }
  for(int i=0;i<=m;++i)
	  cout<<v[i]<<" ";
      cout<<endl;
 }

int main()
{   int v[20];
    cout<<"The Array is size:";
    input(v);
	//cout<<"please input the sort:  ";
	//int i;
	//cin>>i;
	//max_heapify(v,i);
	output(v);
	cout<<heap_extra_max(v)<<endl;
	output(v);
	cout<<"please input insert postion and key;"<<endl;
	int a, key;
	cin>>a>>key;
	heap_increase_key(v,a,key);
	output(v);
	cout<<"please input the insert key:"<<endl;
	cin>>key;
	max_heap_insert(v,key);
	output(v);
	heapsort(v);
	//max_heapify_effective(v,i);
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值