中南大学算法实验报告.docx

上传人:b****4 文档编号:3317409 上传时间:2022-11-21 格式:DOCX 页数:14 大小:325.73KB
下载 相关 举报
中南大学算法实验报告.docx_第1页
第1页 / 共14页
中南大学算法实验报告.docx_第2页
第2页 / 共14页
中南大学算法实验报告.docx_第3页
第3页 / 共14页
中南大学算法实验报告.docx_第4页
第4页 / 共14页
中南大学算法实验报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

中南大学算法实验报告.docx

《中南大学算法实验报告.docx》由会员分享,可在线阅读,更多相关《中南大学算法实验报告.docx(14页珍藏版)》请在冰豆网上搜索。

中南大学算法实验报告.docx

中南大学算法实验报告

算法分析与设计

实验报告

 

学院:

 信息科学与工程学院

专业班级:

 物联网工程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;k

printf("%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(low

while(low=pivotkey)--high;

L.elem[low]=L.elem[high];//将比枢轴记录小的记录移到低端

while(low

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

if(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&&k

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

for(j=i+1;j

if((Node[i].value/(float)Node[i].weight)

temp=Node[i];

Node[i]=Node[j];

Node[j]=temp;

}

}

}

}

//装载主要方法

voidload(){

inti;

for(i=0;i

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

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

printf("请输入第%d个物品的重量和价值",i+1);

scanf("%f%f",&Node[i].weight,&Node[i].value);

}

printf("\n请输入背包容积:

");

scanf("%f",&Weight);

sort();

load();

putout();

return0;

}

 

心得体会

许多算法老师上课时讲的比较详细,加上上学期数据结构的基础,总体来说本次实验完成的还比较顺利。

虽然这个过程中也遇到了一些小问题,通过翻书基本可以解决。

通过本次实验,更加深刻的了解了分治,回溯,贪心算法,也增强了对这门课的兴趣,同时也锻炼了自己动手将算法变为代码的能力。

 

WelcomeTo

Download!

!

!

 

欢迎您的下载,资料仅供参考!

 

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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