学习内容:
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时先手必败。