• 应试记录3


    #include <stdio.h>
    int h[ 101];//用来存放堆的数组
    int n;//用来存储堆中元素的个数,也就是堆的大小
     
    //交换函数,用来交换堆中的两个元素的值
    void swap(int x,int y)
    {
        int t;
        t=h[ x];
        h[ x]=h[ y];
        h[ y]=t;
    }
     
    //向下调整函数
    void siftdown(int i) //传入一个需要向下调整的结点编号i,这里传入1,即从堆的顶点开始向下调整
    {
        int t,flag=0;//flag用来标记是否需要继续向下调整
        //当i结点有儿子的时候(其实是至少有左儿子的情况下)并且有需要继续调整的时候循环窒执行
        while( i*2<=n && flag==0 )
        {        
            //首先判断他和他左儿子的关系,并用t记录值较大的结点编号
            if( h[ i] < h[ i*2] )
                t=i*2;
            else
                t=i;
            //如果他有右儿子的情况下,再对右儿子进行讨论
            if(i*2+1 <= n)
            {
                //如果右儿子的值更大,更新较小的结点编号  
                if(h[ t] < h[ i*2+1])
                    t=i*2+1;
            }
            //如果发现最大的结点编号不是自己,说明子结点中有比父结点更大的  
            if(t!=i)
            {
                swap(t,i);//交换它们,注意swap函数需要自己来写
                i=t;//更新i为刚才与它交换的儿子结点的编号,便于接下来继续向下调整
            }
            else
                flag=1;//则否说明当前的父结点已经比两个子结点都要大了,不需要在进行调整了
        }
    }
     
    //建立堆的函数
    void creat()
    {
        int i;
        //从最后一个非叶结点到第1个结点依次进行向上调整
        for(i=n/2;i>=1;i--)
        {
            siftdown(i);
        }  
    }
     
    //堆排序
    void heapsort()
    {
            while(n>1)
        {
                    swap(1,n);
            n--;
            siftdown(1);
        }
    }
     
    int main()
    {
        int i,num;
        //读入n个数
        scanf("%d",&num);
     
        for(i=1;i<=num;i++)
            scanf("%d",&h[ i]);
        n=num;   
     
        //建堆
        creat();
     
        //堆排序
        heapsort();
     
        //输出
        for(i=1;i<=num;i++)
            printf("%d ",h[ i]);
     
        getchar();
        getchar();
        return 0;
    }
    堆排序
    #include<stdio.h>
    #include<stdlib.h>
    int n,i,t,sum=0;
    int a[100];
    int cmp ( const void *a , const void *b )
    
    
    {
    return *(int *)a - *(int *)b;
    }
    int main()
    {
    
    
    
        for(i=1;i<=10;i++)
            scanf("%d ",&a[i]);
            
            qsort(a,10,sizeof(a[0]),cmp);
        for(i=1;i<=10;i++)
            printf("%d ",a[i]);
    
        
        return 0;
    }
    qsort
    #include<stdio.h>
    #include<stdlib.h>
    int n,i,t,sum=0;
    int a[100];
    int cmp ( const void *a , const void *b )
    
    
    {
    return *(int *)a - *(int *)b;
    }
    int main()
    {
    
    
    
        for(i=1;i<=10;i++)
            scanf("%d ",&a[i]);
            
            qsort(a,10,sizeof(a[0]),cmp);
        for(i=1;i<=10;i++)
            printf("%d ",a[i]);
    
        
        return 0;
    }
    堆排序 down函数
    int main()
    {
        int n,m,i,sx,sy,tx,ty,sum,max=0,mx,my;
        int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
        scanf("%d%d%d%d",&n,&m,&sx,&sy);
        for(i=0;i<n;i++)
            scanf("%s",a[i]);
            h=1;t=1;
            data[t].x=sx;
            data[t].y=sy;
            t++;
        while (h<t)
        {
            for(i=0;i<=3;i++)
            {
                tx=data[h].x+next[i][0];
                ty=data[h].y+next[i][1];
                if(tx<0 || ty< 0 || tx>n-1 || ty>m-1)
                    continue ;
                if(a[tx][ty]=='.' && book[tx][ty]==0)
                {
                    book[tx][ty]=1;
                    data[t].x=tx;
                    data[t].y=ty;
                    t++;
                    sum=enemy(tx,ty);
                    if(sum>max)
                    {
                        max=sum;
                        mx=tx;
                        my=ty;
                    }
                }
            }
        h++;
        }
    广搜
  • 相关阅读:
    如何用Warkdowm来写一篇博客
    关于toString()的一些事情
    python的 range() 函数
    python中的split()函数
    innerHTML和value打架了?
    JS如何实现实时获取网络时间
    javascript内嵌样式与外联样式怎么做?
    c语言实现乘法口诀表
    c语言实现数字的倒序输出
    c语言解一元二次方程
  • 原文地址:https://www.cnblogs.com/QuantumGhost/p/6047952.html
Copyright © 2020-2023  润新知