二叉堆(优先级队列)

    技术2022-05-20  51

    二叉堆分为两种,一种是大顶堆,一种是小顶堆。

    以大顶堆为例,堆得存储用一维数组表示,i结点的左右孩子为2i,2i+1,父亲结点为【i/2】

    基本操作有:

    MAX_heapify(A,i);//堆的调整操作

    bulid_MAX_heap(A,w,size);//创建一个大顶堆

    maximum(A);//取堆顶

    extrack_MAX(A);//取堆顶并删除

    increase_key(A,i,key);//将第i个节点的键值上升到key

    MAX_insert(A,key);//添加结点

    小顶堆的操作类似

    #include <stdio.h> #include <stdlib.h> typedef int WType; typedef struct heap{ WType *key; int size; //属于堆得元素个数 }Heap; void MAX_heapify(Heap *A,int i)//对大顶堆操作的子程序 { int l,r,largest; WType temp; l=2*i;r=2*i+1; if(l<A->size&&A->key[l]>A->key[i]) largest=l; else largest=i; if(r<A->size&&A->key[r]>A->key[largest]) largest=r; if(largest!=i) { temp=A->key[i]; A->key[i]=A->key[largest]; A->key[largest]=temp; MAX_heapify(A,largest); } } void bulid_MAX_heap(Heap *A,WType *w,int size) { int i; A->size=size; A->key=(WType *)malloc(size*sizeof(WType)); for(i=0;i<A->size;i++) A->key[i]=w[i]; for(i=size/2;i>=0;i--) MAX_heapify(A,i); } WType maximum(Heap *A)//返回最大元素 { return A->key[0]; } WType extract_MAX(Heap *A)//去掉并返回最大元素 { if(A->size<0) printf("heap underflow!"); WType max; max=A->key[0]; A->key[0]=A->key[A->size-1]; A->size--; MAX_heapify(A,0); return max; } void increase_key(Heap *A,int i,WType key)//将元素i的值增加到key { if(key<A->key[i]) printf("new key is maller than current key"); A->key[i]=key; WType temp; int i; while(i>0&&A->key[i/2]<A->key[i]) { temp=A->key[i/2]; A->key[i/2]=A->key[i]; A->key[i]=temp; i=i/2; } } void MAX_insert(Heap *A,WType key)//插入操作 { A->size++; A[A->size-1]=-Inf;//-∞ increase_key(A,A->size-1,key); } void main() { int w[10]={4,1,3,2,16,9,10,14,8,7}; Heap A; bulid_MAX_heap(&A,w,10); for(int i=0;i<A.size;i++) printf("%d ",A.key[i]); }

    void MIN_heapify(Heap *A,int i)//对小顶堆操作的子程序 { int l,r,min; WType temp; l=2*i;r=2*i+1; if(l<A->size&&A->key[l]<A->key[i]) min=l; else min=i; if(r<A->size&&A->key[r]<A->key[min]) min=r; if(min!=i) { temp=A->key[i]; A->key[i]=A->key[min]; A->key[min]=temp; MIN_heapify(A,min); } } void bulid_MIN_heap(Heap *A,WType *w,int size) { int i; A->size=size; A->key=(WType *)malloc(size*sizeof(WType)); for(i=0;i<A->size;i++) A->key[i]=w[i]; for(i=size/2;i>=0;i--) MIN_heapify(A,i); } WType minimum(Heap *A)//返回最大元素 { return A->key[0]; } WType extract_MIN(Heap *A)//去掉并返回最大元素 { if(A->size<0) printf("heap underflow!"); WType min; min=A->key[0]; A->key[0]=A->key[A->size-1]; A->size--; MIN_heapify(A,0); return min; } void decrease_key(Heap *A,int i,WType key)//将元素i的值增加到key { if(key>A->key[i]) printf("new key is maller than current key"); A->key[i]=key; WType temp; int i; while(i>0&&A->key[i/2]>A->key[i]) { temp=A->key[i/2]; A->key[i/2]=A->key[i]; A->key[i]=temp; i=i/2; } } void MIN_insert(Heap *A,WType key)//插入操作 { A->size++; A[A->size-1]=Inf;//-∞ decrease_key(A,A->size-1,key); }


    最新回复(0)