ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:38.03KB ,
资源ID:7321602      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7321602.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(各种算法的性能分析.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

各种算法的性能分析.docx

1、各种算法的性能分析实验项目一 各种排序算法的性能测试第1章:简介(Introduction)排序就是将一个记录的无序序列调整成为一个有序序列的过程。在对记录进行排序的时候,需要选定一个信息作为排序的依据,例如,可以按学生姓名对学生记录进行排序,这个特别选定的信息称为关键码。排序的主要目的是为了进行快速查找,这就是为什么字典、电话薄和班级名册都是排好序的。在数据结构课程中,我们已经学过了几种内部排序算法,没有一种排序算法在任何情况下都是最好的解决方案,有些排序算法比较简单,但速度相对比较慢;有些排序算法速度比较快,但却很复杂。1.冒泡排序:设想被排序的数组R1.N垂直竖立,将每个数据元素看作有重

2、量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上漂浮(交换位置),如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。若记录序列的初始状态为正序,则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为逆序,则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。2.快速排序:快速(quicksort)是对的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟将要排序的成独立的两部分,其中一部分的所有数据都比另外一部分的所

3、有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以进行,以此达到整个数据变成有序序列。3.选择排序: 每一趟从待排序的中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。是不稳定的排序方法。通俗的解释:对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素

4、的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。第二章:算法定义(Algorithm Specification)1.冒泡排序通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。冒泡排序算法如下:void bubblesort(int a,int n)速排序 任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元

5、素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。void quicksort(int a,int start,int end)择排序假设待排序的列表的n个数据元素放在数组a中,第一次从n个数据元素中找出最小的元素与a0交换,第二次从剩下的n-1个元素中找出最小的元素与a1交换,直到第n-1次在剩下的两个元素中找出最小的元素与an-1交换,剩下的最后一个元素的位置就在an.选择排序算法如下:void selectsort(int a,int n)泡排序如果有n个数,则要进行n-1趟

6、比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。(1)算法的最好时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数J和记录移动次数I均达到最小值: Jmin =n-1 Imin =0。 冒泡排序最好的时间复杂度为O(n)。(2)算法的最坏时间复杂度 若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1in-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数

7、均达到最大值: Jmax =n(n-1)/2=O(n2 ) Imax =3n(n-1)/2=O(n2 ) 冒泡排序的最坏时间复杂度为O(n2 )。(3)算法的平均时间复杂度为O(n2 ) 虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。(4)算法稳定性 冒泡排序是就地排序,且它是稳定的。2.快速排序:(1)算法的最坏时间复杂度无论适用哪一种方法来选择基准pivot,由于我们不知道各个元素间的相对大小关系(若知道就已经排好序了),所以我们无法确定pivot的选择对划分造成的影响。因此对各种pivot选择法而言,最坏情况和最好情况都是相同的。我们

8、从直觉上可以判断出最坏情况发生在每次划分过程产生的两个区间分别包含n-1个元素和1个元素的时候(设输入的表有n个元素)。下面我们暂时认为该猜测正确,在后文我们再详细证明该猜测。对于有n个元素的表pi,由于函数Partition的计算时间为(n),所以快速排序在序坏情况下的复杂性有递归式如下:T(1)=(1),T(n)=T(n-1)+T(1)+(n) (1)用迭代法可以解出上式的解为T(n)=(n2)。这个最坏情况运行时间与插入排序是一样的。下面我们来证明这种每次划分过程产生的两个区间分别包含n-1个元素和1个元素的情况就是最坏情况。设T(n)是过程quicksort作用于规模为n的输入上的最坏

9、情况的时间,则T(n)=max(T(i)+T(n-i)+(n),其中1in-1 (2)我们假设对于任何kn,总有T(k)ck,其中c为常数;显然当k=1时是成立的。将归纳假设代入(2),得到:T(n)max(ci2+c(n-i)2)+(n)=c*max(i2+(n-i)2)+(n)因为在1,n-1上i2+(n-i)2关于i递减,所以当i=1时i2+(n-i)2有最大值n2-2(n-1)。于是有:T(n)cn2-2c(n-1)+(n)cn2只要c足够大,上面的第二个小于等于号就可以成立。于是对于所有的n都有T(n)cn。这样,排序算法的最坏情况运行时间为(n2),且最坏情况发生在每次划分过程产生

10、的两个区间分别包含n-1个元素和1个元素的时候,时间复杂度为O(n2)。(2)算法的最好时间复杂度 如果每次划分过程产生的区间大小都为n/2,则快速排序法运行就快得多了。这时有:T(n)=2T(n/2)+(n),T(1)=(1) (3)解得:T(n)=(nlogn)由于快速排序法也是基于比较的排序法,其运行时间为(nlogn),所以如果每次划分过程产生的区间大小都为n/2,则运行时间(nlogn)就是最好情况运行时间。(3)算法的平均时间复杂度要想对快速排序的平均情况有个较为清楚的概念,我们就要对遇到的各种输入作个假设。通常都假设输入数据的所有排列都是等可能的。当我们对一个随机的输入数组应用快

11、速排序时,要想在每一层上都有同样的划分是不太可能的。我们所能期望的是某些划分较对称,另一些则很不对称。平均情况下,Partition产生的划分中既有“好的”,又有“差的”。这时,与Partition执行过程对应的递归树中,好、差划分是随机地分布在树的各层上的。为与我们的直觉相一致,假设好、差划分交替出现在树的各层上,且好的划分是最佳情况划分,而差的划分是最坏情况下的划分。在表pi处,划分的代价为n,划分出来的两个子表的大小为n-1和1,即最坏情况。在表的下一层pn-1处,大小为n-1的子表按最佳情况划分成大小各为(n-1)/2的两个子表。在一个差的划分后接一个好的划分后,产生出三个子表,大小各

12、为1,(n-1)/2和(n-1)/2,代价共为2n-1=(n)。从直觉上看,差的划分的代价(n)可被吸收到好的划分的代价(n)中去,结果是一个好的划分。这样,当好、差划分交替分布划分都是好的一样:仍是(nlogn),但记号中隐含的常数因子要略大一些,快速算法的平均时间复杂度为O(nlogn)。3.选择排序:每趟选出一个最值和无序序列的第一个数交换,n个数共选n-1趟。第i趟假设i为最值下标,然后将最值和i+1至最后一个数比较,找出最值的下标,若最值下标不为初设值,则将最值元素和下标为i的元素交换。 选择排序不关心表的初始次序,它的最坏情况的排序时间与其最佳情况没多少区别,其比较次数为 n(n-

13、1)/2,时间复杂度为O(n2 )。所以有:(1)算法的最好时间复杂度为O(n2 ) (2)算法的最坏时间复杂度为O(n2 )(3)算法的平均时间复杂度为O(n2 ) 对于序列初始状态基本有正序,可选择对有序性较敏感的如冒泡排序、选择排序等方法对于序列长度比较大的随机序列,应选择平均时间复杂度较小的快速排序方法。各种排序算法都有各自的优缺点,适应于不同的应用环境,因此在选择一种排序算法解决实际问题之前,应当先分析实际问题的类型,再结合各算法的特点,选择一种合适的算法。附录:源代码(基于C语言的)#include #include #include #define SIZE 10000/待排序数

14、组的规模#define PRT_RT 0/控制是否显示排序后的数组的常量 /PRT_RT=1,则显示输出,为0则不输出void bubblesort(int m,int n)/冒泡排序算法,待排序元素存放在数组m中 int i,j; int temp; for(i=0;ii;j-) if(mj-1mj) temp=mj-1; mj-1=mj; mj=temp; void selectsort(int k,int n)/选择排序算法,待排序元素存放在数组k中 int i,j; int min,temp; for(i=0;in-1;i+) min=i; for(j=i+1;jn;j+) if(kj

15、=end) return; while(ij) while(imid) j-; if(ij) pi=pj; i+; while(ij & pimid) i+; if(ij) pj=pi; j-; pi=mid;quicksort(p,start,i-1);/递归调用快速排序对数组前半部分元素进行排quicksort(p,i+1,end);/ 递归调用快速排序继续对数组后半部分元素进行排序int main()/返回值类型为整型的主函数 int i; long start,end;/定义两个存放时间的变量 double duration;/定义一个存放计算时间的变量int *a;/定义指针变量为随

16、机数分配存储空间 a=(int*)malloc(sizeof(int)*SIZE);/分配SIZE字节的存储空间 srand(unsigned)time(NULL);/设置时间作为随机函数的种子 for(i=0;iSIZE;i+)/随机赋值 ai=rand()%SIZE;/取0,SIZE间的随机整数 /如果PRT_RT=1,则输出待排序的序列,否则输出:“不输出待排序序列” if(PRT_RT = 1) printf(%d ,ai);/输出这个数组 else printf(不输出待排序序列); printf(n); printf(各种算法排序时间及排序后序列如下:); printf(n); /

17、以下统计冒泡排序时间 start=clock();bubblesort(a,SIZE);/在这里插入你要计算时间的算法,这里计算的是冒泡排序算法当规模为SIZE的时候的算法的时间 end = clock(); duration=(double)(end-start)/CLOCKS_PER_SEC; printf(the bubblesort time is :%f seconds,duration);/输出冒泡排序时间 printf(n); /以下显示冒泡排序结果,如果PRT_RT=1,则输出排序后的序列,否则输出:“不输出冒泡排序后序列” if(PRT_RT = 1) for(i=0; iS

18、IZE; i+) printf(%d , ai); else printf(不输出冒泡排序后的序列); printf(n); printf(n); system(pause); /以下统计快速排序时间 start = clock(); quicksort(a,0,SIZE-1);/在这里插入你要计算时间的算法,这里计算的是快速排序算法当规模为SIZE的时候的算法的时间 end = clock(); duration = (double)(end-start)/CLOCKS_PER_SEC;printf(the quicksort time is :%f seconds,duration);/输

19、出统计最后时间 printf(n);/以下显示冒泡排序结果,如果PRT_RT=1,则输出排序后的序列,否则输出:“不输出冒泡排序后序列” if(PRT_RT = 1) for(i=0; iSIZE; i+) printf(%d , ai); else printf(不输出快速排序后的序列); printf(n); system(pause); /以下统计选择排序时间 start=clock();selectsort(a,SIZE);/在这里插入你要计算时间的算法,这里计算的是选择排序算法当规模为SIZE的时候的算法的时间 end = clock(); duration=(double)(end

20、-start)/CLOCKS_PER_SEC; printf(the selectsort time is :%f seconds,duration);/输出选择排序时间/以下显示冒泡排序结果,如果PRT_RT=1,则输出排序后的序列,否则输出:“不输出选择排序后序列” if(PRT_RT = 1) for(i=0; iSIZE; i+) printf( %d,ai); else printf(不输出选择排序后的序列); printf(n); printf(n); system(pause); return 0; 声明 我们在此声明,这个题为“各种排序算法的性能测试”的项目的所有工作是由作为一组的我们的成员的各自的努力而完成的。人员安排:程序员:测试员: 完成日期:

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

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