zoukankan      html  css  js  c++  java
  • 堆的一些简单操作

      仅仅是记录一下自己写过的堆操作的代码,个人觉得堆的优势在于建立和获取最小或者最大元的方便,有任何次序要求的算法,堆并不合适。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct _priorityqueue
    {
        int capacity;
        int currentsize;
        int *member;
    
    }priorityqueue;
    
    void printpriorityqueue(priorityqueue *pq)
    {
        for(int i = 1;i<pq->currentsize+1;i++)
            printf("%d	",pq->member[i]);
        printf("
    ");
        printf("
    ");
        return;
    }
    priorityqueue* percolateup(priorityqueue *pq,int i)
    {
        int tmp = pq->member[i];
        if(pq == 0)
            return 0;
    
        for(;pq->member[i/2] > tmp;i=i/2)
            pq->member[i] = pq->member[i/2];
        pq->member[i] = tmp;
        return pq;
    }
    
    priorityqueue* percolatedown(priorityqueue* pq,int i)
    {
        int tmp = pq->member[i];
        if(pq == 0)
            return 0;
        if(pq->currentsize%2 == 0 && pq->currentsize < pq->capacity)
            pq->member[pq->currentsize + 1] = 0xffffff;
        for(;2*i<pq->currentsize+1;)
        {
            i = pq->member[2*i] < pq->member[2*i+1]?2*i:2*i+1;
            if (pq->member[i] < tmp)
            {
                //tmp = pq->member[i/2];
                pq->member[i/2] = pq->member[i];
                //pq->member[i] = tmp;
            }
            else{
                //pq->member[i/2] = tmp;
                i = i/2;
                break;
            }
        }
        pq->member[i] = tmp;
        return pq;
    }
    
    priorityqueue* initialize(int capacity,int current,int *a)
    {
        int i;
        priorityqueue *tmp = (priorityqueue *)malloc(sizeof(priorityqueue));
        if(tmp == 0)
            return 0;
        tmp->capacity = capacity;
        tmp->currentsize = current;
        tmp->member = (int *)malloc(sizeof(int)*(capacity+1));
        if (tmp->member == 0)
        {
            free(tmp);
            return 0;
        }
        memset(tmp->member,0,sizeof(int)*(capacity+1));
        tmp->member[0] = -1;
        for(i=1;i<current+1;i++)
            tmp->member[i] = a[i-1];
        for(i = tmp->currentsize/2;i>0;i--){
            tmp = percolatedown(tmp,i);
            printpriorityqueue(tmp);
        }
        return  tmp;
    }
    
    priorityqueue *insert(priorityqueue *pq,int m)
    {
        int i;
        if(pq == 0)
            return 0;
        if(pq->currentsize == pq->capacity)
            return 0;
        for(i = pq->currentsize;pq->member[i/2] > m;i = i/2)
            pq->member[i] = pq->member[i/2];
        pq->member[i] = m;
    }
    
    int deletemin(priorityqueue *pq)
    {
        int tmp = pq->member[1];
        pq->currentsize--;
        if(pq->currentsize == 0)
            return tmp;
        pq->member[1] = pq->member[pq->currentsize + 1];
        percolatedown(pq,1);
        return tmp;
    }
    
    
    int findmin(priorityqueue *pq)
    {
        return pq->member[1];
    }
    
    int main()
    {
        int a[] = {150,80,40,30,10,70,110,100,20,90,60,50,120,140,130};
        priorityqueue *pq = initialize(31,15,a);
        for(int i  = 0;i<15;i++)
            printf("%d	",deletemin(pq));
        while(1);
    }
  • 相关阅读:
    Linux下查找软件,rpm命令 dpkg命令 apt命令
    python3 requests的content和text方法
    python3爬虫超简单实例
    python3 爬取深圳主板公司名称,公司网址
    python3 类的学习
    ubuntu16.04同时使用 pyhton2.7和3.5,并随意切换
    (4)puppet常用的资源及其常用属性
    (3)puppet清单定义资源的语法
    (2)puppet单机测试命令apply
    lvs+keepalived高可用负载均衡
  • 原文地址:https://www.cnblogs.com/leo0000/p/5688622.html
Copyright © 2011-2022 走看看