优先级队列的代码,注意两点
1、在下虑的过程中,要保证right不超出界,即right<n,left显然是满足的,因为while(temp<=(n-2)>>1)中,如果left超出界限则while循环条件不满足。
2、下虑过程中,返回值要写在随后,因为不一定会执行while中的break语句,因此不要把break换成return而把最后的return丢掉!
#include<iostream>
#include<algorithm>
using namespace std;
template<typename T>
class Priqueue
{
int maxSize;
int n;
T *A;
public:
Priqueue(int _maxSize)
{
maxSize=_maxSize;
n=0;
A=new T[maxSize];
memset(A,0,4*maxSize);
}
void insert(T t)
{
if(n==maxSize)
{
cout<<"已经超出最大容量"<<endl;
return ;
}
A[n++]=t;
int temp=n-1;
while(temp>0)
{
if(A[(temp-1)>>1]>t)
{
swap(A[temp],A[(temp-1)>>1]);
temp=(temp-1)>>1;
}
else
return;
}
}
T extractMin()
{
if(n==0)
{
cout<<"已经没有元素了"<<endl;
return A[0];
}
swap(A[0],A[--n]);
int temp=0;
while(temp<=(n-2)>>1)
{
int left=(temp<<1)+1,right=(temp<<1)+2;
int max2=left;
if(right<n && A[left]>A[right])
max2=right;
if(A[temp]>A[max2])
{
swap(A[temp],A[max2]);
temp=max2;
}
else
break;
}
return A[n];
}
};
int genRand()
{
return rand()%100;
}
int main()
{
const int N=15;
int Arr[N];
generate(Arr,Arr+N,genRand);
Priqueue<int> pq(N);
for(int i=0;i<N;i++)
pq.insert(Arr[i]);
for(int i=0;i<N;i++)
cout<<pq.extractMin()<<endl;
system("pause");
return 0;
}