博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
优先队列
阅读量:4660 次
发布时间:2019-06-09

本文共 1718 字,大约阅读时间需要 5 分钟。

#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;
}

转载于:https://www.cnblogs.com/liguigen/p/liguigen_blog_priorqueue.html

你可能感兴趣的文章
运算符及题目(2017.1.8)
查看>>
ssh自动分发密匙脚本样板
查看>>
Linux安装postgresql
查看>>
【 全干货 】5 分钟带你看懂 Docker !
查看>>
[转]优化Flash性能
查看>>
popStar手机游戏机机对战程序
查看>>
lambda表达式树
查看>>
二次注入原理及防御
查看>>
会话记住已登录功能
查看>>
Linux内核分析——可执行程序的装载
查看>>
读《大道至简》第六章感想
查看>>
ef linq 中判断实体中是否包含某集合
查看>>
章三 链表
查看>>
函数名作为参数传递
查看>>
apt-get for ubuntu 工具简介
查看>>
数值计算算法-多项式插值算法的实现与分析
查看>>
day8-异常处理与网络编程
查看>>
Python基础-time and datetime
查看>>
shell脚本练习01
查看>>
WPF图标拾取器
查看>>