1月19日

学习内容:

1、Java的关键字private、this
2、希尔排序,归并排序
3、博弈基础

学习时间:

上午
8:00~8:05 签到
9:00~10:30 Java的关键字private、this
11:00~12:30 排序
下午
1:00~2:00 博弈基础
2:30~5:30 刷题
今天重新学习了一下排序,看了下博弈基础,博弈基础学了一部分有些看的不是很懂,只能死记。
希尔排序
原理:以分组原理来解决问题,开始每两个一组,并排序,然后增加每组个数,减少组数,直到全部排序。
代码段

for(step=n/2;step>0;step/=2)
    {
        for(i=0;i<step;i++)//step是有多少组,也就是循环次数
        {
            for(j=i+step;j<n;j+=step)//每组成员的访问
                for(k=j-step;k>=0;k-=step)//后面与前面的比较
                if(a[k+step]<a[k])
                {
                    t=a[k];
                    a[k]=a[k+step];
                    a[k+step]=t;
                }
            else break;//因为前面的已经有序了,比当前的大,就不会比前面的小了,直接可以退出。
        }
    }

归并排序
原理:也是以分组来解决的,由两边有序的数组和成一个有序的数组,先是从每组两个的开始,有点想二分,将一个数组分成很多个二分数组。
代码

void A(int f,int e)
{
    int mid=(f+e)/2;
    if(f>=mid)
    {
        return;
    }

    A(f,mid);//前面的排序
    A(mid+1,e);//后面的排序
    AA(f,mid,e);//排序,先执行调用,直到if不成立
}
void AA(int f,int mid,int e)//排序的函数,最后会给原数组复值
{
    int i=f,j=mid+1,k=f;
    while(i<=mid&&j<=e)
    {
        if(a[i]>a[j])
            {a1[k++]=a[j++];
            sum+=mid-i+1;
            }
        else a1[k++]=a[i++];
    }
    while(i<=mid)
        a1[k++]=a[i++];
    while(j<e)
        a1[k++]=a[j++];
    for(i=f;i<k;i++)
        a[i]=a1[i];
}

博弈基础
1.巴什博弈
例如:取糖果游戏,有n个糖果,只能取1~m,取完最后一个赢。
重要代码

if(n%(1+m)) printf("先取的赢");
else printf("后取的赢");

2.斐波那契博弈
例如:n个糖果,每次只能取1~上次那个人取的2倍。
公式:n是斐波那契数列中的数,先手必败,否则先手必胜。
3.尼姆博弈
例如:在n堆糖果中,每人每次只能在一堆里面拿1~无限个,当取完最后一个时该人获胜。
公式:对每一堆的数量进行异或运算,当结果是0时先手必败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值