1、3.1希尔排序模块设计23.2 多个测试案例的处理方法的模块设计34测试方法45 程序运行效果46 设计心得67附录61 设计内容 有n项任务,要求按顺序执行,并设定第I项任务需要ti单位时间。如果任务完成的顺序为1,2,n,那么第I项任务完成的时间为ci=t1+ti,平均完成时间(ACT)即为(c1+.+cn)/n。本题要求找到最小的任务平均完成时间。2)输入要求输入数据中包含n个测试案例。每一个案例的第一行给出一个不大于2000000的整数n,接着下面一行开始列出n各非负整数t(t1000000000),每个数之间用空格相互隔开,以一个负数来结束输入。3)输出要求对每一个测试案例,打印它的
2、最小平均完成时间,并精确到0.01。每个案例对应的输出结果都占一行。若输入某一个案例中任务数目n=0,则对应输出一个空行。2 设计分析 这个题目属于贪心算法应用中的任务调度问题。要得到所有任务的平均完成时间,只需要将各个任务完成时间从小到大排序,任务实际完成需要的时间等于它等待的时间与自身执行需要的时间之和。这样给出的调度是按照最短作业优先进行来安排的。贪心算法通过一系列的选择来得到一个问题的解。它所做的每一个选择都是当前状态下某种意义的最好选择,即贪心选择。在许多可以用贪心算法求解的问题中一般具有两个重要的性质:贪心选择性质和最有子结构性质。所谓贪心选择性只是指所求问题的整体最优解可以通过一
3、系列局部最优的选择,即贪心选择来达到,这是贪心算法可行的第一基本要素。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所做的贪心选择最终将会得到问题的一个整体最优解。首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。而且做了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步做贪心选择,最终可得到问题的一个整体最优解。其中,证明贪心选择后问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。当一个问题的最优解包含着它的子问题最优解时,称此问题具有最优子结构性质,这个性质是该问题可用贪心算法求解的一个关键特征。2
4、.1 排序(将数组按照从小到大排序)的设计 排序的方法有很多,如:冒泡排序、希尔排序、堆排序等,这些排序的方法都可以使用。这里采用希尔排序来实现。 它的基本思想是:先取一个小于n的整数d1作为第一个增量;这里选取n的一半作为第一个增量(increment=n1),把数组的全部元素分成d1个组。所有距离为d1的倍数的记录放在同一组中。先在各组内进行直接插入排序;然后,取第二个增量d2d1重复上述的分组和排序,直至所取的增量d1=1(dtdt-1d21;increment0;=1)for(i=increment;i=increment;j-=increment)if(temp=0;)scanf(%
5、ld,&n);if(n2000000)printf(too much for the project!n);exit(0);0)b=(long * )malloc(n * sizeof(long);a=b;for(i=0;scanf(,b+i);/*检查输入的数据是否大于1000000000*/if(*(b+i)1000000000)printf(exit(0);/*对输入中出现任务时间为负数的异常处理*/if(*(b+i)i-,a+)rj+=(double)*a/(double)n*i;j+;free(b);/*当n为0时,标志相应的r数组值为-1.输出时遇到-1,则输出一个空行*/else
6、 if(n=0)rj+=-1;for(i=0;j;if(ri=-1)printf(/*输出一个空行8*/else printf(%.2fn,ri);/*输出的结果要求精确到0.01*/return 1;4测试方法 这个程序主要需要测试以下几个方面:l 当任务个数为0时,需要对应输出一个空行。l 当输入的作业数目大于2000000,或者单个作业完成的时间大于1000000000的时候,程序要求报错。l 另外,当任务数比较大的时候,输入对应的任务时间是要仔细,务必保证输入的任务个数与要求的任务数一直。如果出现输入的任务数与n值不相符时,程序应会报错,输出“input error!”的错误。 5 程
7、序运行效果5.1正确输入正确输出。图5.1 正确输入输出数据图5.2异常输入数据5.2.1输入数据超出2000000。图5.2.1 超出作业数目异常图5.2.2任务数较大时输出任务个数与要求任务数不一致。 图5.2.2 任务数不一致异常图5.2.3 单个作业完成时间大于1000000000。图5.2.3 单个作业完成时间超出异常图6 设计心得 通过本次课程设计我在数据结构编程方面领悟了很多。看到这个选题的时候,其实我并不知道贪心算法是什么算法,甚至都无从下手去设计关于这个的编程以及它的报告。 虽然在中间写的过程中还有很多不会的东西,但是通过查看书本和资料还有问同学,基本上都解决了。但仍然有一些
8、有待提高的地方,比如在排序前后的结果比较和如果运行时间长的任务在等待很长时间都没有运行等较高的要求还没有解决。 设计根据书本以及老师和同组同学的帮助,本次设计也算是完成了。我在这次设计中其实自己也没花好时间去完成。关于程序方面也有许多的不明白。但是通过本次设计,我也领悟到自身有许多的不足。以后会更加花心思,下功夫去完成好每一个老师给予的任务,从而提高自己。 我觉得课程设计的作用一方面是最基本的就是要完成这一科目,差不多也是对自己的一个阶段性的总结;还有就是在整个设计的过程中,让我们认真的独立思考,在和同学交流的过程中也增强了我们的语言组织能力和彼此之间的友谊。通过课程设计让我们不断的发现自己的不足从而去改善,这是一种学习的态度,不仅仅是在这次的课程设计中,在以后的无论生活还是学习方面都应该注意和努力改善。7附录#includestdlib.hvoid Shellsort(long *a,long n);int main()long n,i,j;long *a,*b;b=(long* )malloc(n * sizeof(long);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1