算法设计与分析.docx

上传人:b****6 文档编号:8159911 上传时间:2023-01-29 格式:DOCX 页数:24 大小:78.71KB
下载 相关 举报
算法设计与分析.docx_第1页
第1页 / 共24页
算法设计与分析.docx_第2页
第2页 / 共24页
算法设计与分析.docx_第3页
第3页 / 共24页
算法设计与分析.docx_第4页
第4页 / 共24页
算法设计与分析.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

算法设计与分析.docx

《算法设计与分析.docx》由会员分享,可在线阅读,更多相关《算法设计与分析.docx(24页珍藏版)》请在冰豆网上搜索。

算法设计与分析.docx

算法设计与分析

 

湖北大学

计算机与信息工程学院

 

2016——2017学年度

第1学期

 

学生实验报告册

 

学生姓名:

殷开龙

班级:

计科1401班

学号:

2014221119200047

课程名称:

算法设计与分析

任课老师:

戴翰波

 

学生实验守则

1、学生在规定的时间内进行实验,不得无故缺席或迟到。

2、学生在每次实验前对排定要做的实验应进行预习,并按要求作好预习报告。

3、每次实验前,必须交上次实验报告和本次实验预习报告,并经指导教师提问、检查同意后,才可进行本次实验。

4、学生进入实验室指定位置后,首先根据仪器清单核对自己使用的仪器是否有缺少或损坏,发现问题及时向指导教师报告,严禁擅自动用别组仪器。

5、实验时必须有实事求是、严肃认真的科学态度,严格遵守仪器操作规程和注意事项。

6、实验完毕应将实验数据交给指导教师检查,合格后,整理复原好仪器设备,方可离开实验室。

7、保持实验室肃静和整洁,不得大声喧哗,乱丢垃圾和吃东西。

8、学生在实验过程中,由于不遵守操作规程或未经许可,擅自进行实验而造成事故、损坏仪器设备,应及时报告,并填写损坏清单,按院有关规定进行赔偿。

 

实验报告单

实验名称:

Mergesort_________

同组人实验室时间2016.10.14

一、

实验目的:

了解掌握递归和分冶策略中合并排序算法思想,学会运用合并排序算法处理实际问题。

二、实验内容:

用Mergesort算法对10个无序的数字进行排序。

三、实验代码:

#include

usingnamespacestd;

#defineN100

intg_array[N];//存放输入的数字

staticintcount;//存放元素的个数

//初始化函数

voidInitial()

{

cout<<"请输入元素的个数:

";

cin>>count;

cout<<"请输入"<

";

for(inti=0;i

{

cin>>g_array[i];

}

}

//合并函数

voidMerge(inta[],intl,intm,intr)

{

inti=l,j=m+1,k=l;

intb[N];

while(i<=m&&j<=r)

{

if(a[i]<=a[j])

{

b[k++]=a[i++];

}

else

{

b[k++]=a[j++];

}

}

if(i>m)

{

for(intp=j;p<=r;p++)

{

b[k++]=a[p];

}

}

else

{

for(intp=i;p<=m;p++)

{

b[k++]=a[p];

}

}

//把b[]中排好的元素copy到a[]中

for(intq=l;q<=r;q++)

{

a[q]=b[q];

}

}

//归并排序递归算法表示

voidMergeSort(inta[],intleft,intright)

{

if(left

{

inti=(right+left)/2;

MergeSort(a,left,i);

MergeSort(a,i+1,right);

Merge(a,left,i,right);//把left到right的元素排序好

}

}

//打印排好序的数组

voidPrint()

{

cout<<"经过MergeSort后:

";

for(inti=0;i

{

cout<

}

cout<

}

intmain()

{

Initial();

if(count>1)

{

MergeSort(g_array,0,count-1);

Print();

}

elseif(count==1)

{

Print();

}

system("pause");

return0;

}

 

四、实验结果:

 

 

五、实验小结:

 

———————————————————————————————

评语:

 

成绩:

批阅教师:

日期:

实验报告单

实验名称:

Countinginversions________

同组人实验室时间2016.10.21

一、实验目的:

了解并掌握Countinginversions算法得思想。

二、实验内容:

测试数组{1,4,2,9,48,15,13,44,6,90}中的逆序数对。

三、实验代码:

#include

usingnamespacestd;

 

/*归并求逆序对数,arr存储最终有序结果

 *在函数外申请一个临时数组作为参数传入

 *避免递归不断创建临时数组的开销

 */

intMerge(int*arr,intbeg,intmid,intend,int*tmp_arr)

{

    memcpy(tmp_arr+beg,arr+beg,sizeof(int)*(end-beg+1));

    inti=beg;

    intj=mid+1;

    intk=beg;

    intinversion=0; //合并过程中的逆序数

    while(i<=mid&&j<=end)

    {

        if(tmp_arr[i]<=tmp_arr[j])

        {

            arr[k++]=tmp_arr[i++];

        }else

        {

            arr[k++]=tmp_arr[j++];

            inversion+=(mid-i+1);

        }

    }

    while(i<=mid)

    {

        arr[k++]=tmp_arr[i++];

    }

    while(j<=end)

    {

        arr[k++]=tmp_arr[j++];

    }

    returninversion;

}

 

intMergeInversion(int*arr,intbeg,intend,int*tmp_arr)

{

    intinversions=0;   //记录倒序数

    if(beg

    {

        intmid=(beg+end)>>1;

        inversions+=MergeInversion(arr,beg,mid,tmp_arr);

        inversions+=MergeInversion(arr,mid+1,end,tmp_arr);

        inversions+=Merge(arr,beg,mid,end,tmp_arr);

    }

    returninversions;

}

 

/*测试序列:

answer:

10*/

inttestPoint[10]={

    1,4,2,9,48,

   15,13,44,6,90

};

 

voidmain()

{

    intarrcopy[10];     //临时数组

    memcpy(arrcopy,testPoint,sizeoftestPoint);

 

    printf("thenumofinversionsis:

%d\n",

            MergeInversion(testPoint,0,9,arrcopy));

}

 

四、实验结果:

 

 

五、实验小结:

 

———————————————————————————————

评语:

 

成绩:

批阅教师:

日期:

实验报告单

实验名称:

Quitsort___________

同组人实验室时间2016.10.28

一、实验目的:

了解和掌握Quitsort排序算法的思想。

二、实验内容:

利用快速排序算法的思想对一组数据进行从小到大的排序

三、实验代码:

#include

usingnamespacestd;

voidquickSort(inta[],int,int);

intmain()

{

intarray[]={34,65,12,43,67,5,78,10,3,70},k;

intlen=sizeof(array)/sizeof(int);

cout<<"Theorginalarrayare:

"<

for(k=0;k

cout<

cout<

quickSort(array,0,len-1);

cout<<"Thesortedarrayare:

"<

for(k=0;k

cout<

cout<

system("pause");

return0;

}

voidquickSort(ints[],intl,intr)

{

if(l

{

inti=l,j=r,x=s[l];

while(i

{

while(i=x)//从右向左找第一个小于x的数

j--;

if(i

s[i++]=s[j];

while(i

i++;

if(i

s[j--]=s[i];

}

s[i]=x;

quickSort(s,l,i-1);//递归调用

quickSort(s,i+1,r);

}

}

四、实验结果:

 

五、实验小结:

 

———————————————————————————————

评语:

 

成绩:

批阅教师:

日期:

实验报告单

实验名称:

Strassenalgorithm________

同组人实验室时间2016.11.04

一、实验目的:

了解并掌握Strassenalgorithm算法的基本思想。

二、实验内容:

运用Strassenalgorithm算法计算两个矩阵的乘法。

三、实验代码:

//STRASSEN矩阵算法

#include

constintN=8;//常量N用来定义矩阵的大小

voidmain()

{

voidSTRASSEN(intn,floatA[][N],floatB[][N],floatC[][N]);

voidinput(intn,floatp[][N]);

voidoutput(intn,floatC[][N]);//函数声明部分

floatA[N][N],B[N][N],C[N][N];//定义三个矩阵A,B,C

cout<<"现在录入矩阵A[N][N]:

"<

input(N,A);

cout<

"<

input(N,B);//录入数组

STRASSEN(N,A,B,C);//调用STRASSEN函数计算

output(N,C);//输出计算结果

}

voidinput(intn,floatp[][N])//矩阵输入函数

{

inti,j;

for(i=0;i

{

cout<<"请输入第"<

for(j=0;j

cin>>p[i][j];

}

}

voidoutput(intn,floatC[][N])//据矩阵输出函数

{

inti,j;

cout<<"输出矩阵:

"<

for(i=0;i

{

cout<

for(j=0;j

cout<

}

cout<

}

voidMATRIX_MULTIPLY(floatA[][N],floatB[][N],floatC[][N])//按通常的矩阵乘法计算C=AB的子算法(仅做2阶)

{

inti,j,t;

for(i=0;i<2;i++)//计算A*B-->C

for(j=0;j<2;j++)

{

C[i][j]=0;//计算完一个C[i][j],C[i][j]应重新赋值为零

for(t=0;t<2;t++)

C[i][j]=C[i][j]+A[i][t]*B[t][j];

}

}

voidMATRIX_ADD(intn,floatX[][N],floatY[][N],floatZ[][N])//矩阵加法函数X+Y—>Z

{

inti,j;

for(i=0;i

for(j=0;j

Z[i][j]=X[i][j]+Y[i][j];

}

voidMATRIX_SUB(intn,floatX[][N],floatY[][N],floatZ[][N])//矩阵减法函数X-Y—>Z

{

inti,j;

for(i=0;i

for(j=0;j

Z[i][j]=X[i][j]-Y[i][j];

}

voidSTRASSEN(intn,floatA[][N],floatB[][N],floatC[][N])//STRASSEN函数(递归)

{

floatA11[N][N],A12[N][N],A21[N][N],A22[N][N];

floatB11[N][N],B12[N][N],B21[N][N],B22[N][N];

floatC11[N][N],C12[N][N],C21[N][N],C22[N][N];

floatM1[N][N],M2[N][N],M3[N][N],M4[N][N],M5[N][N],M6[N][N],M7[N][N];

floatAA[N][N],BB[N][N],MM1[N][N],MM2[N][N];

inti,j;//,x;

if(n==2)

MATRIX_MULTIPLY(A,B,C);//按通常的矩阵乘法计算C=AB的子算法(仅做2阶)

else

{

for(i=0;i

for(j=0;j

{

A11[i][j]=A[i][j];

A12[i][j]=A[i][j+n/2];

A21[i][j]=A[i+n/2][j];

A22[i][j]=A[i+n/2][j+n/2];

B11[i][j]=B[i][j];

B12[i][j]=B[i][j+n/2];

B21[i][j]=B[i+n/2][j];

B22[i][j]=B[i+n/2][j+n/2];

}//将矩阵A和B式分为四块

MATRIX_SUB(n/2,B12,B22,BB);//////////

STRASSEN(n/2,A11,BB,M1);//M1=A11(B12-B22)

MATRIX_ADD(n/2,A11,A12,AA);

STRASSEN(n/2,AA,B22,M2);//M2=(A11+A12)B22

MATRIX_ADD(n/2,A21,A22,AA);

STRASSEN(n/2,AA,B11,M3);//M3=(A21+A22)B11

MATRIX_SUB(n/2,B21,B11,BB);

STRASSEN(n/2,A22,BB,M4);//M4=A22(B21-B11)

MATRIX_ADD(n/2,A11,A22,AA);

MATRIX_ADD(n/2,B11,B22,BB);

STRASSEN(n/2,AA,BB,M5);//M5=(A11+A22)(B11+B22)

MATRIX_SUB(n/2,A12,A22,AA);

MATRIX_SUB(n/2,B21,B22,BB);

STRASSEN(n/2,AA,BB,M6);//M6=(A12-A22)(B21+B22)

MATRIX_SUB(n/2,A11,A21,AA);

MATRIX_SUB(n/2,B11,B12,BB);

STRASSEN(n/2,AA,BB,M7);//M7=(A11-A21)(B11+B12)

//计算M1,M2,M3,M4,M5,M6,M7(递归部分)

MATRIX_ADD(N/2,M5,M4,MM1);//////////

MATRIX_SUB(N/2,M2,M6,MM2);

MATRIX_SUB(N/2,MM1,MM2,C11);//C11=M5+M4-M2+M6

MATRIX_ADD(N/2,M1,M2,C12);//C12=M1+M2

MATRIX_ADD(N/2,M3,M4,C21);//C21=M3+M4

MATRIX_ADD(N/2,M5,M1,MM1);

MATRIX_ADD(N/2,M3,M7,MM2);

MATRIX_SUB(N/2,MM1,MM2,C22);//C22=M5+M1-M3-M7

for(i=0;i

for(j=0;j

{

C[i][j]=C11[i][j];

C[i][j+n/2]=C12[i][j];

C[i+n/2][j]=C21[i][j];

C[i+n/2][j+n/2]=C22[i][j];

}//计算结果送回C[N][N]

}

}

四、实验结果:

 

五、实验小结:

———————————————————————————————

评语:

 

成绩:

批阅教师:

日期:

实验报告单

实验名称:

Kargar’salgorithm________

同组人实验室时间2016.11.11

一、实验目的:

掌握线型的掩码及含义,并会使用线型掩码画出虚线、点画线。

了解线粗的画法。

二、实验内容:

完成掌握线型和线粗算法并将运行结果截图写入实验报告。

 

三、实验代码:

#include

#include"conio.h"

usingnamespacestd;

structgood//表示物品的结构体

{

doublep;//价值

doublew;//重量

doubler;//价值与重量的比

}

a[20];

doubles,value,m;

inti,num;

boolbigger(gooda,goodb)

{

returna.r>b.r;

}

intmain()

{

printf("\t\t---------贪心算法解决背包问题----------\n");

printf("请输入您要输入的货物的个数:

");

scanf("%d",&num);//物品个数

printf("请输入货物的重量与价值格式为(wp)每输入一组数据回车:

\n");

intk;

for(i=0;i

{

scanf("%lf%lf",&a[i].w,&a[i].p);

a[i].r=a[i].p/a[i].w;

}

sort(a,a+num,bigger);//调用sort排序函数

printf("请输入包的容量:

");

scanf("%lf",&m);//读入包的容量m

s=0;//包内现存货品的重量

value=0;//包内现存货品总价值

for(i=0;i

{

value+=a[i].p;

s+=a[i].w;

k=i;

}

value+=(m-s)*a[k+1].r;

printf("背包的最大总价值为%.2lf.\n",value);//输出结果

getch();

return0;

}

 

四、实验结果:

 

五、实验小结:

 

———————————————————————————————

评语:

 

成绩:

批阅教师:

日期:

实验报告单

实验名称:

Dijkstra__________

同组人实验室时间2016.11.18

一、实验目的:

了解并掌握Dijkstra算法的基本思想。

二、实验内容:

运用Dijkstra算法计算一个节点到其他所有节点的最短路径。

三、实验代码:

#include

#include

#include

usingnamespacestd;

constintmaxnum=100;

constintmaxint=999999;

//个数组下标都从1开始

intdist[maxnum];//表示当前点到源点的最短路径长度

intprev[maxnum];//记录当前点的前一个结点

intc[maxnum][maxnum];//记录图的两点间路径长度

intn,line;//图的节点数和路径数

/*

*n--nnodes

*v--thesourcenode

*dist[]--thedistancefromtheithnodetothesourcenode

*prev[]--thepreviousnodeoftheithnode

*c[][]--everytwonodes'distance

*/

voidDijkstra(in

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

当前位置:首页 > 人文社科 > 法律资料

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

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