算法导论课设5个.docx
- 文档编号:29892890
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:24
- 大小:138.46KB
算法导论课设5个.docx
《算法导论课设5个.docx》由会员分享,可在线阅读,更多相关《算法导论课设5个.docx(24页珍藏版)》请在冰豆网上搜索。
算法导论课设5个
课程实验报告
课程名称算法导论
题目堆排序计数排序贪心算法散列表动态规划
(院)系理学院专业_信息与计算科学
班级1202班_学号260222_
学生姓名孙银东黄君叶勇___
导师姓名阳卫锋__
完成日期______2014年11月20日___________
题目一堆排序
班级:
信科1202姓名:
孙银东黄君叶勇
一、实验目的:
掌握堆的创建,学会利用堆进行排序。
二、实验内容:
对数组利用堆进行排序。
三、实验要求:
1)写出算法的伪代码和C程序代码
2)记录每一步数组的中元素的变化
程序代码参考
#include
#defineLength10
intcompare(inta,intb)//用于比较值的大小
{
if(a>b)
{return0;}
elseif(a
{return1;}
else
{return-1;}
}
voidswap(int&a,int&b)//自定义的交换函数,目的是交换函数值
{
inttmp;
tmp=a;
a=b;
b=tmp;
}
voidheapify(intA[],intidx,intmax)//保持堆的性质
{
intlargest;
intleft_child=2*idx+1;
intright_child=2*idx+2;
if(left_child { largest=left_child; } else { largest=idx; } if(right_child { largest=right_child; } if(largest! =idx) { swap(A[largest],A[idx]); heapify(A,largest,max); } } voidbuildheap(intA[])//建堆 { inti; for(i=Length/2-1;i>=0;i--) { heapify(A,i,Length); } } intmain() { intA[Length]={2,60,3,234,1,0,41234343,23,56,-23}; buildheap(A); inti,j; for(i=Length-1;i>=0;--i) { swap(A[0],A[i]); heapify(A,0,i); } for(j=0;j { printf("%d\n",A[j]); } return0; } 四、结果分析 堆排序设计结果: 五、总结 对数组利用堆进行排序,要求我们对前期所学知识了解透彻,这样可以很快得到结论 题目二计数排序 一、实验目的: 学习使用计数排序。 二、实验内容: 对数组利用计数排序进行排序。 三、实验要求: 1)写出算法的伪代码和C程序代码 2)记录每一步数据结构(比如数组)中元素的变化 程序代码参考 #include intmain() { usingnamespacestd; intconstlen=10; inti,j,count; i=j=count=0; intarray_old[len]; for(i=0;i<10;i++) {scanf("%d",&array_old[i]); } intarray_new[len]; for(i=0;i {for(j=0;j { if(array_old[i]>array_old[j]) count++; } array_new[count]=array_old[i]; count=0; } cout<<"Theresult: "< for(i=0;i {cout< } cout< system("pause"); return0; } 四、结果分析 计数排序设计结果: (1)输入十个数字 (2)输出结果 五、总结 将数学中的排序问题弄懂,就能很快解决计数排序问题 题目三贪心算法程序设计 一、实验目的: 掌握贪心算法。 二、实验内容: 设n是一个正整数。 现在要求将n分解为若干个互不相同的自然数的和,且使这些自然数的乘积最大。 对于给定的正整数n,编程计算最优分解方案。 三、实验要求: 利用贪心算法思想写出算法的伪代码和C程序代码。 程序代码参考 #include #include inttanxin(intn)//贪心算法实现函数 { inta[100]; intk=1,sum=1,s=0; if(n<5)sum=n; else { a[1]=2; n-=2; while(n>a[k]) { k++; a[k]=a[k-1]+1; n-=a[k]; s=k; } if(n==a[k]) { a[k]++; n--; } for(inti=0;i a[k-i]++; for(intj=1;j<=s;j++) sum*=a[j]; } returnsum; } intmain(intargc,char*argv[])//主函数测试 { intn; printf("请输入要求的数: \n"); scanf("%d",&n); printf("%d\n",tanxin(n));system("pause"); return0; } 四、结果分析 贪心算法设计结果: 五总结 要了解贪心算法的核心原理,上机多操作,才能发现不足,得出结果 题目四: 散列表算法程序设计 实验目的: 1.通过本次实验进一步理解散列表的概念; 2.掌握散列表的创建; 3.掌握散列表中数据的存储与查找。 程序代码: #include #include #include #include #defineMAXSIZE20//商场商品记录数量 #defineMAX_SIZE20//商品的最大长度 #defineHASHSIZE53//定义表长 #defineSUCCESS1 #defineUNSUCCESS-1 #defineLENsizeof(HashTable) typedefintStatus; typedefcharNA[MAX_SIZE]; typedefstruct{//记录 NAname; NAtel; NAadd; }Record; typedefstruct{//散列表 Record*elem[HASHSIZE];//数据元素存储基址 intcount;//当前数据元素个数 intsize;//当前容量 }HashTable; Statuseq(NAx,NAy){//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS if(strcmp(x,y)==0) returnSUCCESS; elsereturnUNSUCCESS; } StatusNUM_BER;//记录的个数 voidgetin(Record*a){//键盘输入各商品的信息 printf("输入要添加的个数: \n"); scanf("%d",&NUM_BER); inti; for(i=0;i printf("请输入第%d个记录的商品名: \n",i+1); scanf("%s",a[i].name); printf("请输入%d个记录的商品ID: \n",i+1); scanf("%s",a[i].tel); printf("请输入第%d个记录的地址: \n",i+1); scanf("%s",a[i].add);//gets(str2);? ? ? ? ? ? } } voidShowInformation(Record*a)//显示输入的商品信息 { inti; for(i=0;i printf("\n第%d个商品信息: \n商品: %s\n商品ID: %s\n联系地址: %s\n",i+1,a[i].name,a[i].tel,a[i].add); } voidCls(Record*a){ printf("*"); system("cls"); } longfold(NAs){//商品的折叠处理 char*p; longsum=0; NAss; strcpy(ss,s);//复制字符串,不改变原字符串的大小写 strupr(ss);//将字符串ss转换为大写形式 p=ss; while(*p! ='\0') sum+=*p++; printf("\nsum====================%d",sum); returnsum; } intHash1(NAstr){//散列函数 longn; intm; n=fold(str);//先将商品名进行折叠处理 m=n%HASHSIZE;//折叠处理后的数,用除留余数法构造散列函数 returnm;//并返回模值 } intHash2(NAstr){//散列函数 longn; intm; n=atoi(str);//把字符串转换成整型数. m=n%HASHSIZE;//用除留余数法构造散列函数 returnm;//并返回模值 } Statuscollision(intp,int&c){//冲突处理函数,采用二次探测再散列法解决冲突 inti,q; i=c/2+1; while(i if(c%2==0){ c++; q=(p+i*i)%HASHSIZE; if(q>=0)returnq; elsei=c/2+1; } else{ q=(p-i*i)%HASHSIZE; c++; if(q>=0)returnq; elsei=c/2+1; } } returnUNSUCCESS; } voidbenGetTime(); voidCreateHash1(HashTable*H,Record*a){//建表,以商品的商品为关键字,建立相应的散列表 //若散列地址冲突,进行冲突处理 benGetTime(); inti,p=-1,c,pp; for(i=0;i c=0; p=Hash1(a[i].name); pp=p; while(H->elem[pp]! =NULL){ pp=collision(p,c); if(pp<0){ printf("第%d记录无法解决冲突",i+1);//需要显示冲突次数时输出 continue; }//无法解决冲突,跳入下一循环 } H->elem[pp]=&(a[i]);//求得散列地址,将信息存入 H->count++; printf("第%d个记录冲突次数为%d。 \n",i+1,c);//需要显示冲突次数时输出 } printf("\n建表完成! \n此散列表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count); benGetTime(); } voidSearchHash1(HashTable*H,int&c){//在记录里查找商品关键字,若查找成功,显示信息 //c用来记录冲突次数,查找成功时显示冲突次数 benGetTime(); NAstr; printf("\n请输入要查找记录的商品: \n"); scanf("%s",str); intp,pp; p=Hash1(str); pp=p; while((H->elem[pp]! =NULL)&&(eq(str,H->elem[pp]->name)==-1)) pp=collision(p,c); if(H->elem[pp]! =NULL&&eq(str,H->elem[pp]->name)==1){ printf("\n查找成功! \n查找过程冲突次数为%d.以下是您需要要查找的信息: \n\n",c); printf("商品: %s\n商品ID: %s\n联系地址: %s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); } elseprintf("\n此商品不存在,查找不成功! \n"); benGetTime(); } voidbenGetTime(){ SYSTEMTIMEsys; GetLocalTime(&sys); printf("%4d/%02d/%02d%02d: %02d: %02d.%03d\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds); } voidCreateHash2(HashTable*H,Record*a){//建表,以商品ID为关键字,建立相应的散列表 //若散列地址冲突,进行冲突处理 benGetTime(); inti,p=-1,c,pp; for(i=0;i c=0; p=Hash2(a[i].tel); pp=p; while(H->elem[pp]! =NULL){ pp=collision(p,c); if(pp<0){ printf("第%d记录无法解决冲突",i+1);//需要显示冲突次数时输出 continue; }//无法解决冲突,跳入下一循环 } H->elem[pp]=&(a[i]);//求得散列地址,将信息存入 H->count++; printf("第%d个记录冲突次数为%d。 \n",i+1,c);//需要显示冲突次数时输出 } printf("\n建表完成! \n此散列表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count); benGetTime(); } voidSearchHash2(HashTable*H,int&c){//在记录里查找商品ID关键字,若查找成功,显示信息 //c用来记录冲突次数,查找成功时显示冲突次数 benGetTime(); NAtele; printf("\n请输入要查找记录的商品ID: \n"); scanf("%s",tele); intp,pp; p=Hash2(tele); pp=p; while((H->elem[pp]! =NULL)&&(eq(tele,H->elem[pp]->tel)==-1)) pp=collision(p,c); if(H->elem[pp]! =NULL&&eq(tele,H->elem[pp]->tel)==1){ printf("\n查找成功! \n查找过程冲突次数为%d.以下是您需要要查找的信息: \n\n",c); printf("商品: %s\n商品ID: %s\n联系地址: %s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); } elseprintf("\n此商品不存在,查找不成功! \n"); benGetTime(); } voidSave(){ FILE*fp; if((fp=fopen("c: \test.txt","w"))==NULL){ printf("\nERRORopeningcustometfile"); } fclose(fp); } intmain(intargc,char*argv[]){ intc,flag=1; HashTable*H; H=(HashTable*)malloc(LEN); for(inti=0;i H->elem[i]=NULL; H->size=HASHSIZE; H->count=0; Recorda[MAXSIZE]; while (1){ printf("\n┏━━━━━━━━━━━━━┓"); printf("\n┃欢迎使用商品查找系统┃"); printf("\n┏〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓┓"); printf("\n┃★★★★★★★散列表的设计与实现★★★★★★★┃"); printf("\n┃【1】.添加商品信息┃"); printf("\n┃【2】.读取所有商品信息┃"); printf("\n┃【3】.以商品名建立散列表(散列法解决冲突)┃"); printf("\n┃【4】.以商品ID建立散列表(散列法解决冲突)┃"); printf("\n┃【5】.查找并显示给定商品的记录┃"); printf("\n┃【6】.查找并显示给定ID的记录┃"); printf("\n┃【7】.清屏┃"); printf("\n┃【8】.保存┃"); printf("\n┃【9】.退出程序┃"); printf("\n┃提示: ┃"); printf("\n┃Ⅰ.进行5操作前请先输出3┃"); printf("\n┃Ⅱ.进行6操作前请先输出4┃"); printf("\n┗〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓┛"); printf("\n"); printf("请输入一个任务选项>>>"); printf("\n"); intnum; scanf("%d",&num); switch(num){ case1: getin(a); break; case2: ShowInformation(a); break; case3: CreateHash1(H,a);/*以商品建立散列表*/ break; case4: CreateHash2(H,a);/*以商品ID建立散列表*/ break; case5: c=0; SearchHash1(H,c); break; case6: c=0; SearchHash2(H,c); break; case7: Cls(a); break; case8: Save(); break; case9: return0; break; default: printf("你输错了,请重新输入! "); printf("\n"); } } system("pause"); return0; } 运行结果 实验五动态规划程序设计 一、实验目的: 掌握动态规划算法。 二、实验内容: 对维数为序列(5,10,3,12,5,50,6)的各矩阵。 找出其矩阵链乘的一个最优加全括号。 三、实验要求: 利用动态规划思想写出算法的伪代码和C程序代码 程序参考代码 #include #include chara[500],b[500]; charnum[501][501];///记录中间结果的数组 charflag[501][501];///标记数组,用于标识下标的走向,构造出公共子序列 voidLCS();///动态规划求解 voidgetLCS();///采用倒推方式求最长公共子序列 intmain() { inti; strcpy(a,"ABCBDAB"); strcpy(b,"BDCABA"); memset(num,0,sizeof(num)); memset(flag,0,sizeof(flag)); LCS(); printf("%d\n",num[strlen(a)][strlen(b)]); getLCS(); return0; } voidLCS() { inti,j; for(i=1;i<=strlen(a);i++) { for(j=1;j<=strlen(b);j++) { if(a[i-1]==b[j-1])///注意这里的下标是i-1与j-1 { num[i][j]=num[i-1][j-1]+1; flag[i][j]=1;///斜向下标记 } elseif(num[i][j-1]>num[i-1][j]) { num[i][j]=num[i][j-1]; flag[i][j]=2;///向右标记
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 导论
![提示](https://static.bdocx.com/images/bang_tan.gif)