《数据结构》课程设计模板作业.docx
- 文档编号:10772517
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:14
- 大小:137.91KB
《数据结构》课程设计模板作业.docx
《《数据结构》课程设计模板作业.docx》由会员分享,可在线阅读,更多相关《《数据结构》课程设计模板作业.docx(14页珍藏版)》请在冰豆网上搜索。
《数据结构》课程设计模板作业
数据结构课程设计
班级计算机科学与技术
(2)
学号20082308054
姓名陈进胜
指导教师李振宏
时间:
年月日至年月日
成绩
指导教师签字年月日
排序综合
摘要:
利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。
要求:
1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。
并把排序后的结果保存在不同的文件中。
2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。
3)如果采用4种或4种以上的方法者,可适当加分。
1设计目的:
利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序
2设计内容
(1)显示随机数:
调用Dip()函数输出数组a[]。
数组a[]中保存有随机产生的随机数。
(2)直接选择排序:
通过n-I次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换之。
(4)冒泡排序:
如果有n个数,则要进行n-1趟比较。
在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。
(5)希尔排序:
先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
(6)直接插入排序:
将一个记录插入到已排序好的有序表中,从而得到一个新的、记录数增1的有序表。
设整个排序有n个数,则进行n-1趟插入,即:
先将序列中的第1个记录看成是一个有序的子序列,然后从第2个记录起逐个进行插入,直至整个序列变成按关键字非递减有序列为止。
各种函数的存储都是通过顺序存储来存储的
3源程序
{
system("cls");
menu();
scanf("%d",&p);包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。
#include
#include
#include
#include
#defineN20000
voidDisp(inta[])//数组输出函数
{
inti;
system("cls");
for(i=0;i { if((i-1)%10==9) printf("\n"); printf("%-7d",a[i]); } getchar(); } voidInsertSort(inta[])//插入排序 { FILE*fp; fp=fopen("c: \\插入排序.txt","w"); inti,j,temp; intb[N]; for(i=0;i b[i]=a[i]; for(i=1;i { temp=b[i]; for(j=i;j>0&&b[j-1]>temp;j--) b[j]=b[j-1]; b[j]=temp; } for(i=0;i fprintf(fp,"%d",b[i]); fclose(fp); } voidSelectSort(inta[])//选择排序 { FILE*fp; fp=fopen("c: \\选择排序.txt","w"); inti,j,k; intb[N]; for(i=0;i b[i]=a[i]; for(i=0;i { k=i; for(j=i+1;j if(b[j] k=j; if(k! =i) { inttemp; temp=b[k]; b[k]=b[i]; b[i]=temp; } } for(i=0;i fprintf(fp,"%d",b[i]); fclose(fp); } voidBubbleSort(inta[])/*冒泡排序算法*/ { FILE*fp; fp=fopen("c: \\冒泡排序.txt","w"); inti,j,temp; intb[N]; for(i=0;i b[i]=a[i]; for(i=0;i { for(j=N-1;j>i;j--)/*比较,找出本趟最小关键字的记录*/ if(b[j] { temp=b[j];/*进行交换,将最小关键字记录前移*/ b[j]=b[j-1]; b[j-1]=temp; } } for(i=0;i fprintf(fp,"%d",b[i]); fclose(fp); } voidShellSort(inta[])/*希尔排序算法*/ { FILE*fp; fp=fopen("c: \\希尔排序.txt","w"); inti,j,d,temp; intb[N]; for(i=0;i b[i]=a[i]; d=N/2;/*d取初值n/2*/ while(d>0) { for(i=d;i { j=i-d; while(j>=0&&b[j]>b[j+d]) { temp=b[j];/*b[j]与b[j+d]交换*/ b[j]=b[j+d]; b[j+d]=temp; j=j-d; } } d=d/2;/*递减增量d*/ } for(i=0;i fprintf(fp,"%d",b[i]); fclose(fp); } voidmenu()//主菜单显示函数// { printf("***************综合排序*************\n"); printf("08计算机二班陈进胜\n"); printf("*菜单*\n"); printf("***************************\n"); printf("§1---显示随机数§\n"); printf("§2---直接选择排序§\n"); printf("§3---冒泡排序§\n"); printf("§4---希尔排序§\n"); printf("§5---直接插入排序§\n"); printf("§6---输出最短两个排序§\n"); printf("§0---退出§\n"); printf("************************************\n"); printf("\n====>请在上述序号中选择一个并输入: "); } voidWrong()//错误提示函数 { printf("\n=====>按键错误! \n"); getchar(); } voidPRT1(doubletime)//输出运行时间函数 { system("cls"); printf("=====>程序运行时间为%f秒。 ",time); printf("\n请输入回车键返回! "); getchar();getchar(); } doubleMin(doublex,doubley)//求最小值 { if(x>y) returny; else returnx; } voidmain()//主函数 { inti,p,a[N]; doubletime1,time2,time3,time4,temp; doubleone,two; clock_tstart,end; srand((int)time(NULL));/*随机种子*/ for(i=0;i a[i]=rand()%30000+1; while (1) if(p==0) { printf("=====>谢谢使用! \n"); getchar(); break; } switch(p) { case1: Disp(a);getchar();break; case2: start=clock(); SelectSort(a); end=clock(); time1=((double)(end-start))/CLOCKS_PER_SEC; PRT1(time1);break; case3: start=clock(); BubbleSort(a); end=clock(); time2=((double)(end-start))/CLOCKS_PER_SEC; PRT1(time2);break; case4: start=clock(); ShellSort(a); end=clock(); time3=((double)(end-start))/CLOCKS_PER_SEC; PRT1(time3);break; case5: start=clock(); InsertSort(a); end=clock(); time4=((double)(end-start))/CLOCKS_PER_SEC; PRT1(time4); break; case6: one=Min(Min(time1,time2),Min(time3,time4)); if(one==time1) { two=Min(Min(time2,time3),time4); printf("===>时间最短的排序是“直接选择排序”。 \n"); } if(one==time2) { two=Min(Min(time1,time3),time4); printf("===>时间最短的排序是“冒泡排序”。 \n"); } if(one==time3) { two=Min(Min(time1,time2),time4); printf("===>时间最短的排序是“希尔排序”。 \n"); } if(one==time4) { two=Min(Min(time1,time2),time3); printf("===>时间最短的排序是“直接插入排序”。 \n"); } if(two==time1) printf("===>其次的排序是“直接选择排序”。 \n"); if(two==time2) printf("===>其次的排序是“冒泡排序”。 \n"); if(two==time3) printf("===>其次的排序是“希尔排序”。 \n"); if(two==time4) printf("===>其次的排序是“直接插入排序”。 \n"); getchar();getchar(); break; default: Wrong();getchar();break; } } } 流程图 调试分析 系统运行图 这个我们开始进入的选择菜单,我们只要选择0~6这7个数字就可以操作了。 (如图1) (图1) 选择1就会出现20000个随机数,在这里不能全部显示出来,只显示了一部分。 (图2) (图2) 选择2就进行直接选择排序,(如图3)图中只出现了直接排序的时间,排好序的数已经从到了c盘中的“选择排序.txt”文件。 分别选择3、4、5就会分别进入了冒泡排序(图4)、希尔排序(图5)、直接插入排序(图6)。 显示同选择2。 (图3) (图4) (图5) (图6) 选择6则会出现最快和其次的排序方法,(如图7) (图7) 4、总结 在编写程序的时候,我遇到了很多问题,不过最难解决的问题还是程序运行时间如何计算的问题。 开始在网上找了很久也没找到正确方法,终于最后我的同伴找到了,稍作调试后。 运用在程序中,发现程序就基本完善了,于是解决了这个问题。 在编程的过程的过程中,对C语言也是一种很好的复习和加强。 通过对这几个排序的综合处理,我对排序有了更深入的了解,哪些排序效率高,适用于哪些方面用。 各个排序的代码也熟悉了不少。 这样的课程设计,使我从中学到很多很多,而且让我对编程越来越有心得和信心,也加大了我对编程的乐趣和爱好。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 模板 作业
![提示](https://static.bdocx.com/images/bang_tan.gif)