10计本算法实验比赛日程表.docx
- 文档编号:11039264
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:14
- 大小:46.40KB
10计本算法实验比赛日程表.docx
《10计本算法实验比赛日程表.docx》由会员分享,可在线阅读,更多相关《10计本算法实验比赛日程表.docx(14页珍藏版)》请在冰豆网上搜索。
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循环就可以很简单的写完。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 算法 实验 比赛 日程表
![提示](https://static.bdocx.com/images/bang_tan.gif)