第六章堆排序之“最大优先级队列”

来源:互联网 发布:crontab 执行php延迟 编辑:程序博客网 时间:2024/06/06 08:33

用最大堆实现最大优先级队列:

//返回堆的最大值
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;}


原创粉丝点击