优先队列

#include<stdio.h>
#include<limits.h>
#define SIZE 100
#define LEFT(i)  i<<1
#define RIGHT(i) (i<<1)+(1)
#define PARENT(i)  i>>1

void swap(int *p,int *q)
{
     int tmp=*p;
     *p=*q;
     *q=tmp;
}

void maxHeapIFY(int *arr,int i,int heapsize)
{
     int l=LEFT(i);
     int r=RIGHT(i);
     int largest;
     if(l<=heapsize&&arr[l]>arr[i])
     largest=l;
     else
     largest=i;
     if(r<=heapsize&&arr[r]>arr[largest])
     largest=r;
     
     if(largest!=i)
     {
         swap(&arr[i],&arr[largest]);
         maxHeapIFY(arr,largest,heapsize);
     }
     
}

/*int maxNum(int *arr)
{
    return arr[1];
}*/

int heapExactMax(int *arr,int *heapsize)
{
    if(*heapsize<1)
    exit(0);
    
    int max=arr[1];
    arr[1]=arr[*heapsize];
    *heapsize=*heapsize-1;
    maxHeapIFY(arr,1,*heapsize);
    
    return max;
}

void heapIncreaseKey(int *arr,int i,int key)
{
     if(key<arr[i])
     exit(0);
     arr[i]=key;
     while(i>1&&arr[PARENT(i)]<arr[i])
     {
          swap(&arr[i],&arr[PARENT(i)]);
          i=PARENT(i);
     }
}

void heapInsertKey(int *arr,int key,int *heapsize)
{
     *heapsize=*heapsize+1;
     arr[*heapsize]=INT_MIN;
     heapIncreaseKey(arr,*heapsize,key);
}

int main()
{
    
    int arr[SIZE]={0,1,56,32,4,64,32,53};
    //int initLength;
    int initHeapSize=7;
    int i=initHeapSize>>1;
    for(;i>=1;i--)
    {
        maxHeapIFY(arr,i,initHeapSize);
    }
    
    /*int max=maxNum(arr);
    printf("%d",max);*/
    
    //int max=heapExactMax(arr,&initHeapSize);
    //printf("%d\n",max);
    
    //heapIncreaseKey(arr,3,1000);
    //heapInsertKey(arr,78,&initHeapSize);
    
    int key;
    while(scanf("%d",&key)&&key!=-1)
    {
        heapInsertKey(arr,key,&initHeapSize);
    }
    
    int initLength=initHeapSize;
    int j=initHeapSize;
    for(;j>=2;j--)
    {
        swap(&arr[1],&arr[j]);
        initHeapSize=initHeapSize-1;
        maxHeapIFY(arr,1,initHeapSize);
    }
    
    
    int k=1;
    for(;k<=initLength;k++)
    {
        printf("%d ",arr[k]);
    }
    
    
    
    
    system("pause");
    return 0;
}

posted @ 2013-09-13 13:39  liguigen  阅读(245)  评论(0编辑  收藏  举报