10计本算法实验比赛日程表.docx

上传人:b****8 文档编号:11039264 上传时间:2023-02-24 格式:DOCX 页数:14 大小:46.40KB
下载 相关 举报
10计本算法实验比赛日程表.docx_第1页
第1页 / 共14页
10计本算法实验比赛日程表.docx_第2页
第2页 / 共14页
10计本算法实验比赛日程表.docx_第3页
第3页 / 共14页
10计本算法实验比赛日程表.docx_第4页
第4页 / 共14页
10计本算法实验比赛日程表.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

10计本算法实验比赛日程表.docx

《10计本算法实验比赛日程表.docx》由会员分享,可在线阅读,更多相关《10计本算法实验比赛日程表.docx(14页珍藏版)》请在冰豆网上搜索。

10计本算法实验比赛日程表.docx

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;i

a[i]=sc.nextInt();

naturalsort(a);

System.out.println("输出排序后的数组");

for(inti=0;i

System.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;j

if(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;i

a[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;j

schedule[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;i

for(intj=0;j

System.out.print(a[i][j]+"");

}

System.out.println();

}

}

privatestaticvoidinitArrayn(int[]n,intm){

//TODOAuto-generatedmethodstub

n[0]=1;

for(inti=1;i

n[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循环就可以很简单的写完。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1