10计本算法实验比赛日程表.docx
《10计本算法实验比赛日程表.docx》由会员分享,可在线阅读,更多相关《10计本算法实验比赛日程表.docx(14页珍藏版)》请在冰豆网上搜索。
![10计本算法实验比赛日程表.docx](https://file1.bdocx.com/fileroot1/2023-2/24/ea987bd3-58b8-4097-a333-9e13354a05ab/ea987bd3-58b8-4097-a333-9e13354a05ab1.gif)
10计本算法实验比赛日程表
实验报告3
课程数据结构与算法实验名称递归与分治策略(三)第页
班级10计本学号105032010111姓名陈兴灶
实验日期:
2012年3月13日报告退发(订正、重做)
一、实验目的
掌握递归及分治策略的原理和应用。
二、实验环境
1、微型计算机一台
2、WINDOWS操作系统,JavaSDK,Eclipse开发环境
三、实验内容
必做题:
1、编程实现求第k大算法。
2、编程实现自然合并排序算法。
附加题:
1、将圆盘堆在一起,如果某一小圆盘在大圆盘之下,则这两个圆盘构成倒置圆盘对,给定圆盘数量为n,请编程统计倒置圆盘对数量。
2、设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次;
(3)循环赛一共进行n-1天。
3、编程实现显示xMan图形:
xxxx
xx
xxxx
xx
x
xx
xxxx
xx
xxxx
四、实验步骤和结果
第一题第k小元素算法
packageshiyan_3;
importjava.util.Scanner;
publicclassQuickSort{
publicstaticintquicksort(int[]a,intstart,intend,intk)
{
if(start==end)returna[start];
inti=partition(a,start,end);
intj=i-start+1;
if(j>k)returnquicksort(a,start,j-1,k);
if(j==k)returna[i];
elsereturnquicksort(a,j+1,end,k-j);
}
publicstaticintpartition(int[]a,intp,intr)
{
inti=p,j=r+1;
intx=a[p];
while(true)
{
while(a[++i]while(a[--j]>x);
if(i>=j)break;
inttemp=a[i];
a[i]=a[j];
a[j]=temp;
}
a[p]=a[j];
a[j]=x;
returnj;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Scannersc=newScanner(System.in);
System.out.println("输入数组长度");
intn=sc.nextInt();
int[]a=newint[n+1];
System.out.println("输入数组各元素");
for(inti=1;i<=n;i++)
a[i]=sc.nextInt();
System.out.println("找第几小的元素");
intk=sc.nextInt();
intx=quicksort(a,1,n,k);
System.out.println("第"+k+"小的元素为"+x);
}
}
结果
第二题自然排序
packageshiyan_3;
importjava.util.Scanner;
publicclassNatrualSort{
publicstaticint[]b;
publicstaticvoidmerge(int[]c,int[]d,intl,intm,intr)
{
inti=l;
intj=m+1;
intk=l;
while((i<=m)&&(j<=r))
if(c[i]d[k++]=c[i++];
elsed[k++]=c[j++];
if(i>m)
for(intq=j;q<=r;q++)
d[k++]=c[q];
else
for(intq=i;q<=m;q++)
d[k++]=c[q];
}
publicstaticvoidcopy(int[]c,int[]b,intleft,intright)
{
for(inti=left;i<=right;i++)
{
c[i]=b[i];
}
}
publicstaticvoidnaturalsort(inta[])
{
intmiddle=0;
intend=0;
inti=0;
while(i{
middle=end;
for(;middle{
if(a[middle]>a[middle+1])
break;
}
end=middle+1;
for(;end{
if(a[end]>a[end+1])
break;
}
merge(a,b,0,middle,end);
copy(a,b,0,end);
if(end==a.length-1)
break;
}
}
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
System.out.println("输入数组长度");
intn=sc.nextInt();
int[]a=newint[n];
b=newint[n];
System.out.println("输入数组各元素");
for(inti=0;ia[i]=sc.nextInt();
naturalsort(a);
System.out.println("输出排序后的数组");
for(inti=0;iSystem.out.print(a[i]+"");
}
}
结果
选做题
1统计倒置圆盘对数量
packageshiyan_3;
importjava.util.Scanner;
publicclassClaculate{
publicstaticintk=0;
publicstaticintclaculate(int[]a)
{
inti,j;
for(i=0;i{
for(j=i+1;jif(a[j]>a[i])
k++;
}
returnk;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Scannersc=newScanner(System.in);
System.out.println("输入盘子个数");
intn=sc.nextInt();
int[]a=newint[n];
System.out.println("输入各盘子直径");
for(inti=0;ia[i]=sc.nextInt();
intx=claculate(a);
System.out.println("圆盘对个数为"+x);
}
}
结果
第二题:
packagedfsdaf;
importjava.util.Scanner;
publicclassSchedule{
intnumber;
int[][]schedule;
publicSchedule(intnum)
{
intx=1;
for(inti=1;i<=num;i++)x*=2;
number=x;
schedule=newint[number+1][number+1];
init();
bs(num);
print();
}
publicvoidinit()
{
for(intj=0;jschedule[0][j]=0;
schedule[1][j]=j;
schedule[j][0]=0;
}
}
publicvoidbs(intk){
if(k==0)
return;
else{
bs(k-1);
intm=(int)Math.scalb(1,k-1);//m=2的K-1次方
intn=(int)Math.scalb(1,k);
inti=0,j=0;
for(i=1;i<=m;i++)
for(j=m+1;j<=n;j++)
schedule[i][j]=schedule[i][j-m]+m;
for(i=m+1;i<=n;i++)
{
for(j=1;j<=m;j++)
schedule[i][j]=schedule[i-m][j+m];
for(j=m+1;j<=n;j++)
schedule[i][j]=schedule[i-m][j-m];
}
}
}
publicvoidprint()
{
for(inti=1;i<=number;i++)
{
for(intj=1;j<=number;j++)
System.out.print(schedule[i][j]+"");
System.out.println();
}
}
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
intn=sc.nextInt();
newSchedule(n);
}
}
结果
第三题:
packageshiyan_3;
importjava.util.Scanner;
publicclassxMan{
/**
*@paramargs
*/
staticchar[][]xArray;
staticint[]n3;
staticint[]n5;
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
System.out.println("请输入n值:
");
Scannersc=newScanner(System.in);
intn=sc.nextInt();
n3=newint[n+1];
n5=newint[n+1];
initArrayn(n3,3);
initArrayn(n5,5);
intlen=n3[n];
xArray=newchar[len][len];
xMan(0,0,n);
showArray2(xArray);
}
privatestaticvoidshowArray2(char[][]a){
//TODOAuto-generatedmethodstub
for(inti=0;ifor(intj=0;jSystem.out.print(a[i][j]+"");
}
System.out.println();
}
}
privatestaticvoidinitArrayn(int[]n,intm){
//TODOAuto-generatedmethodstub
n[0]=1;
for(inti=1;in[i]=n[i-1]*m;
}
}
privatestaticvoidxMan(intx,inty,intn){
//TODOAuto-generatedmethodstub
if(n==0){
xArray[x][y]='x';
return;
}
xMan(x,y,n-1);
xMan(x+n3[n-1],y+n3[n-1],n-1);
xMan(x+n3[n-1]*2,y,n-1);
xMan(x,y+n3[n-1]*2,n-1);
xMan(x+n3[n-1]*2,y+n3[n-1]*2,n-1);
}
}
结果:
五、实验总结
一、首先由于这星期比较忙,选做题第三题我只是理解一遍老师的算法,然后考过去的,后面我会自己再做。
二、自然排序那一题我用老师的方法做了,大概一样就没粘上了,以上是我自己的算法,不过效率会较低。
三、选做题第一题不是很明白老师的用意是什么,我只知道用两个for循环就可以很简单的写完。