用最大堆实现最大优先级队列:
//返回堆的最大值
int HeapMaximum(int *a)
//去掉并返回堆中具有最大关键字的元素
int HeapExtractMax(int *a,int *heapSize)
//将元素x的关键字值增加到k,这里k不能小于x的原关键字值
void HeapIncreaseKey(int *a,int i,int k)
//将元素x插入到堆中
void MaxHeapInsert(int *a,int *heapSize,int key)
#include <stdio.h>
#include <string.h>
#include <time.h>
#define BUFFER_SIZE 10
//堆调整,保持堆性质
void MaxHeapIfy(int *a,int i,int heapSize)
{
int left=i;
int right=i;
int tmp;
int largest=i;
while(i<=heapSize)
{
left=i<<1;//左子索引
right=(i<<1)+1;//(移位运算比算术运算优先级低!)右子索引
largest=i;
if(left<=heapSize&&a[i]<a[left])
{
largest=left;
}
if(right<=heapSize&&a[largest]<a[right])
{
largest=right;
}
if(i!=largest)//不加这个判断可能会产生死循环,一个劲的在i这打转
{
tmp=a[i];
a[i]=a[largest];
a[largest]=tmp;
i=largest;//其实消除递归就要看每次递归变化的那个量
}
else
{
break;
}
}
}
//建堆
void BuildMaxHeap(int *a,int heapSize)
{
int i=0;
for(i=BUFFER_SIZE/2;i>0;i--)
{
MaxHeapIfy(a,i,heapSize);
}
}
//返回堆的最大值
int HeapMaximum(int *a)
{
return a[1];
}
//去掉并返回堆中具有最大关键字的元素
int HeapExtractMax(int *a,int *heapSize)
{
int max=0;
int n=*heapSize;
if(n<1)
{
return -1;
}
max=a[1];
a[1]=a[n];
*heapSize=n-1;
MaxHeapIfy(a,1,*heapSize);
return max;
}
//将元素x的关键字值增加到k,这里k不能小于x的原关键字值
void HeapIncreaseKey(int *a,int i,int k)
{
int tmp=0;
if(k<a[i])
{
return;
}
a[i]=k;
while(i>1&&a[i]>a[i>>1])
{
tmp=a[i];
a[i]=a[i>>1];
a[i>>1]=tmp;
i=i>>1;
}
}
//将元素x插入到堆中
void MaxHeapInsert(int *a,int *heapSize,int key)
{
*heapSize+=1;
a[*heapSize]=key-1;//随便赋予新添加的这个元素一个小于key的值
HeapIncreaseKey(a,*heapSize,key);
}
void Output(int *a,int len)
{
int i=1;
for(i=1;i<=len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
int i=0;
int heapSize=0;
int a[BUFFER_SIZE+1];//第一个位置即a[0]不用,这样计算子节点的索引简单点。
memset(a,0,sizeof(a));
srand((unsigned)time(NULL));
for(i=1;i<=BUFFER_SIZE;i++)
{
a[i]=rand()%BUFFER_SIZE;
}
printf("随机生成数组:");
Output(a,BUFFER_SIZE);
//建立最大堆
BuildMaxHeap(a,BUFFER_SIZE);
printf("建立最大堆为:");
Output(a,BUFFER_SIZE);
//返回堆中最大关键字元素
printf("返回堆中最大关键字元素:%d\n",HeapMaximum(a));
//去掉并返回堆中具有最大关键字的元素
heapSize=BUFFER_SIZE;
printf("去掉并返回堆中具有最大关键字的元素:%d\n",HeapExtractMax(a,&heapSize));
//将元素x的关键字值增加到k,这里k不能小于x的原关键字值
HeapIncreaseKey(a,4,BUFFER_SIZE*2);
printf("将元素a[4]的关键字值增加到BUFFER_SIZE*2:");
Output(a,heapSize);
//将元素x插入到堆中
MaxHeapInsert(a,&heapSize,BUFFER_SIZE*3);
printf("将元素BUFFER_SIZE*3插入到堆中:");
Output(a,heapSize);
system("pause");
return 0;
}