应试记录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++;
    }
广搜

 

posted @ 2016-11-09 18:01  LutyBKY  阅读(161)  评论(0编辑  收藏  举报