最新中南大学算法实验报告.docx
《最新中南大学算法实验报告.docx》由会员分享,可在线阅读,更多相关《最新中南大学算法实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
最新中南大学算法实验报告
算法分析与设计
实验报告
学院:
信息科学与工程学院
专业班级:
物联网工程1301班
指导老师:
向瑶
学号:
姓名:
实验一----------------------------------------3
实验目的-----------------------------------------3
实验内容-----------------------------------------3
实验原理及部分代码---------------------------------3
实验结果------------------------------------------4
源代码-------------------------------------------4
实验二----------------------------------------7
实验目的-----------------------------------------7
实验内容-----------------------------------------7
实验原理及部分代码---------------------------------7
实验结果------------------------------------------8
源代码-------------------------------------------8
实验三----------------------------------------10
实验目的-----------------------------------------10
实验内容-----------------------------------------10
实验原理及部分代码---------------------------------10
实验结果------------------------------------------11
源代码-------------------------------------------11
心得体会-----------------------------------------14
实验一递归与分治
一、实验目的
1、理解递归算法的思想和递归程序的执行过程,并能熟练编写递归程序。
2、掌握分治算法的思想,对给定的问题能设计出分治算法予以解决。
二、实验内容
设计算法并编程实现快速排序
三、实验原理及部分代码
1、建立顺序表存储数据(顺序表的第一存储单元不放数据,存储数据个数)
2、设置high与low指向表的两端,表的第一个数充当关键字依次从表的右端,左端与high,low进行比较,是的比关键字大的在关键字的左边,比关键字小的在表的有右边。
以关键字为枢轴位置,分为高低子表进行递归排序。
四、实验结果
五、源代码
#include"stdio.h"
#include"stdlib.h"
#defineOVERFLOW-2
typedefstruct
{int*elem;
intlength;
}SqList;
SqListcreate(intn)//建立一个顺序表
{SqListL;
L.elem=(int*)malloc(n*sizeof(int));
if(!
L.elem)exit(OVERFLOW);
L.length=n;
for(intj=1;j{printf("请输入第%d个整数:
\n",j);
scanf("%d",&L.elem[j]);
}
printf("输入的数据如下:
\n",j);
for(intk=1;kprintf("%6d",L.elem[k]);
printf("\n");
returnL;
}
intPartition(SqList&L,intlow,inthigh)
{//交换顺序表L中子序列L.elem[low..high]的记录,使枢轴记录到位,
//并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它
intpivotkey;
L.elem[0]=L.elem[low];//用子表的第一个记录作枢轴记录
pivotkey=L.elem[low];//枢轴记录关键字
while(lowwhile(low=pivotkey)--high;
L.elem[low]=L.elem[high];//将比枢轴记录小的记录移到低端
while(lowL.elem[high]=L.elem[low];//将比枢轴记录大的记录移到高端
}
L.elem[low]=L.elem[0];//枢轴记录到位
returnlow;//返回枢轴位置
}//Partition
voidQSort(SqList&L,intlow,inthigh){
//对顺序表L中的子序列L.r[low..high]进行快速排序
intpivotloc;
if(low{pivotloc=Partition(L,low,high);//将L.elem[low..high]一分为二
QSort(L,low,pivotloc-1);//对低子表递归排序,pivotloc是枢轴位置
QSort(L,pivotloc+1,high);//对高子表递归排序
}
}//QSort
SqListQuickSort(SqList&L)
{QSort(L,1,L.length);
returnL;
}
voidmain()
{SqListT;
intn,low,high;
charyes_no;
do
{do
{printf("请输入顺序表的长度(大于0)(注:
第一个存储单元不存放数据):
\n");
scanf("%d",&n);
}while(n<=0);
T=create(n);
T=QuickSort(T);
printf("快速排序后数据如下:
\n");
for(intk=2;k<=n;k++)
printf("%6d",T.elem[k]);
printf("\n");
do
{printf("排序完毕");
scanf("%s",&yes_no);
}while(yes_no!
='Y'&&yes_no!
='y'&&yes_no!
='N'&&yes_no!
='n');
}while(yes_no=='Y'||yes_no=='y');
}
实验二回溯
一、实验目的
熟练掌握回溯算法
二、实验内容
设计算法并编程用回溯算法实现n皇后问题
三、实验原理及部分代码
1、检验是否发生冲突
2、先判断一行中某列可以放皇后,找到后移到下一行。
某行不能放置时,回溯。
四、实验结果
五、源代码
#include//非递归的回溯
#include
intx[100];
boolplace(intk)//考察皇后k放置在x[k]列是否发生冲突
{
inti;
for(i=1;iif(x[k]==x[i]||abs(k-i)==abs(x[k]-x[i]))//不在同一列,不在对角线上
returnfalse;
returntrue;
}
voidqueue(intn)
{
inti,k;
x[1]=0;
k=1;
while(k>=1)
{
x[k]=x[k]+1;//在下一列放置第k个皇后
while(x[k]<=n&&!
place(k))
x[k]=x[k]+1;//搜索下一列
if(x[k]<=n&&k==n)//得到一个输出
{
for(i=1;i<=n;i++)
printf("%d",x[i]);
printf("\n");
//return;//若return则只求出其中一种解,若不return则可以继续回溯,求出全部的可能的解
}
elseif(x[k]<=n&&kk=k+1;//放置下一个皇后
else
{
x[k]=0;//重置x[k],回溯
k=k-1;
}
}
}
voidmain()
{
intn;
printf("输入皇后个数n:
\n");
scanf("%d",&n);
queue(n);
}
实验三贪心与随机算法
一、实验目的
理解贪心算法的思想和执行过程,并能熟练编写程序。
二、实验内容
设计算法并编程实现0/1背包问题
三、实验原理及部分代码
1、预处理按性价比冒泡排序
2、装载时先将性价比高的先放入背包中,直至背包装满
四、实验结果
五、源代码
#include
intM;
structnode{
floatvalue;
floatweight;
intflag;
}Node[20],temp;
floatValue,curvalue=0;
floatWeight,curweight=0;
//预处理按性价比排序
voidsort(){
inti,j;
for(i=0;ifor(j=i+1;jif((Node[i].value/(float)Node[i].weight)
temp=Node[i];
Node[i]=Node[j];
Node[j]=temp;
}
}
}
}
//装载主要方法
voidload(){
inti;
for(i=0;iif((Node[i].weight+curweight)<=Weight){
curvalue+=Node[i].value;
curweight+=Node[i].weight;
Node[i].flag=1;
}else{
Node[i].flag=0;
}
}
}
//进行结果的输出
voidputout(){
inti;
printf("选中物品的重量分别为:
\n");
for(i=0;iif(Node[i].flag){
printf("物品");
printf("%d",i+1);
printf(":
");
printf("%.2f",Node[i].weight);
printf("\n");
}
}
printf("\n总价值为:
%.2f\n",curvalue);
}
intmain(){
inti;
printf("请输入物品的总数量:
");
scanf("%d",&M);
printf("请输入物品的重量和价值:
\n");
for(i=0;iprintf("请输入第%d个物品的重量和价值",i+1);
scanf("%f%f",&Node[i].weight,&Node[i].value);
}
printf("\n请输入背包容积:
");
scanf("%f",&Weight);
sort();
load();
putout();
return0;
}
2、你大部分的零用钱用于何处?
据调查统计,有近94%的人喜欢亲戚朋友送给自己一件手工艺品。
无论是送人,个人兴趣,装饰还是想学手艺,DIY手工制作都能满足你的需求。
下表反映了同学们购买手工艺制品的目的。
如图(1-4)
与此同时,上海市工商行政管理局也对大学生创业采取了政策倾斜:
凡高校毕业生从事个体经营的,自批准经营日起,1年内免交登记注册费、个体户管理费、集贸市场管理费、经济合同鉴证费、经济合同示范文本工本费等,但此项优惠不适用于建筑、娱乐和广告等行业。
(三)上海的文化对饰品市场的影响
手工艺品,它运用不同的材料,通过不同的方式,经过自己亲手动手制作。
看着自己亲自完成的作品时,感觉很不同哦。
不论是01年的丝带编织风铃,02年的管织幸运星,03年的十字绣,04年的星座手链,还是今年风靡一时的针织围巾等这些手工艺品都是陪伴女生长大的象征。
为此,这些多样化的作品制作对我们这一创业项目的今后的操作具有很大的启发作用。
根据调查资料分析:
大学生的消费购买能力还是有限的,为此DIY手工艺品的消费不能高,这才有广阔的市场。
随科技的迅速发展,人们的生活日益趋向便捷、快速,方便,对于我国传统的手工艺制作,也很少有人问津,因此,我组想借此创业机会,在校园内开个DIY创意小屋。
它包括编织、刺绣、串珠等,让我们传统的手工制作也能走进大学,丰富我们的生活。
(二)对“碧芝”自制饰品店的分析
1、作者:
蒋志华《市场调查与预测》,中国统计出版社2002年8月§11-2市场调查分析书面报告
(1)价格低心得体会
许多算法老师上课时讲的比较详细,加上上学期数据结构的基础,总体来说本次实验完成的还比较顺利。
虽然这个过程中也遇到了一些小问题,通过翻书基本可以解决。
通过本次实验,更加深刻的了解了分治,回溯,贪心算法,也增强了对这门课的兴趣,同时也锻炼了自己动手将算法变为代码的能力。