1、 算法设计与分析实验报告年级:_专业:_学号:_姓名:_第 1 章 算法分析基本概念实验 1.1 算法计算时间复杂度和增长率(4 学时)1. 实验目的通过算法的程序实现和执行时间测试、并与理论上的结论进行对比分析,深入理解算法时间复杂度分析中对于输入数据考虑其等价类的意义,理解算法时间复杂度渐进性态和和增长率的概念,为后续学习和实验奠定基础,同时也学习程序效率测试的基本思路。2. 实验准备 算法时间复杂度分析的相关概念(1) 算法的计算时间取决于算法中某些操作的执行次数,这些操作是算法时间复杂度分析的依据。(2) 增长率反映了算法的计算时间复杂度,即随着算法输入规模的增加、算法计算时间增加的趋
2、势。(3) 算法的计算时间复杂度针对输入数据的等价类来分析或测试。 随机数生成算法通过程序生成(伪)随机数,作为实验用测试数据。可使用编程语言自带的 random函数生成,也可以采用一些有效的随机数生成算法生成,例如“线性同余法” ,基于该算法,只要参数选择合适,所产生的伪随机数就能满足均匀性和独立性,与真正的随机数具有相近的性质。该算法的基本思想如下:通过设置 Xi+1=(aXi+c) mod m, n0,其中的 4 个整数参数:m模数, m0;a乘数, 0 a#include#include #include /用于做种子int array1000; /全局变量,起始数组void merg
3、e(int v,int left,int mid,int right) /合并left,mid和mid+1,rightint i,j,k=0;i=left; /i 为第一路的下标j=mid+1; /j 为第二路的下标int *temp=new intright-left+1;while(i=num) /下标不能溢出mid=num-1;if(right=num)right=num-1;merge(v,j,mid,right);j=right+1;count+;printf(“MergeSort Start!n“);for(int z=0;zarrayj+1)swp=arrayj+1; /用 sw
4、p 作为中间变量实现数组元素的交换arrayj+1=arrayj;arrayj=swp;se=1;count+;for(int k=0;kn;k+) /显示排好序的数组于屏幕printf(“%d “,arrayk);printf(“n“);printf(“comparings times is:%dn”,count);Merge_sort(array, n); /调用归并排序函数生成随机数的代码为:srand(time(NULL);/使用这个就可以每次不同int n ;printf(“please input the array number:“);scanf(“%d“, /输入数组元素个数f
5、or(int i=0;in;i+)arrayi= rand()%100;printf(“%dn“,arrayi); /显示生成的随机数组(2)运行结果截图:4. 实验步骤和要求 测试数据准备如上图,采用 srand 与 rand 方法生成随机数。 算法计算时间复杂度的概念(1) 如代码中所示,在比较循环中设置计数器 count,每比较一次,则执行count+,即 count 自增 1。以此来统计比较操作的次数。(2) 两次生成不同的 100 个随机数,采用冒泡排序的比较次数分别为:73 次和 97 次。由此数据看出,输入的数据不同,则采用相同算法排序所需的比较次数也会不同,即所需的时间会发生变
6、化。因此,在比较不同算法的复杂度时,应当选择输入相同的数据等价类,这样才有可比性。(3) 折线图:冒 泡 与 合 并 排 序 操 作 次 数 比 较 折 线 图050000100000150000数 据 容 量比较次数 冒 泡 排 序合 并 排 序冒 泡 排 序 7 96 983 9841 99892合 并 排 序 11 102 1001 1005 1000321 2 3 4 5其中 x 轴由 1 至 5 分别表示数据容量为 10,100,1000,1000,1000005. 实验总结由折线图可以看出,在数据量不大的时候两种排序算法的复杂度区别不大。但当数据量变大时,冒泡排序要优于合并排序,即所需时间更短。同时,我们要理解在作比较实验时,要学会控制变量,要采用等价类数据来进行操作。