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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

五种排序算法分析课件Word格式.docx

1、代码1:srand(unsigned)time(NULL);For i=0 to 19 randNum(MAX,array);当问题规模较小时,生成随机函数randNum()在for循环下运行时间短,每次产生的随机数组都是一样的,将srand(unsigned)time(NULL)语句放在for循环外面,就产生了20组不同的随机数组。图1、产生20组随机数组2、选择排序代码2:for i=0 to n-2 min=ifor j= i+1 to n-1if eleminelej min=jswap(elei,elemin) /交换元素 图2、选择排序在不同数据规模下排序所消耗的时间3、冒泡排序代

2、码3:for i= 0 to n-1for j=0 to n-1-iif ajaj+1swap(aj,aj+1) /交换图3、冒泡排序在不同数据规模下排序所消耗的时间3、合并排序代码4:MERGE(A, p, q, r) n1 q - p + 1 n2 r - q create arrays L1 n1 + 1 and R1 n2 + 1 for i 1 to n1 do Li Ap + i - 1 for j 1 to n2 do Rj Aq + j Ln1 + 1 Rn2 + 1 i 1 j 1 for k p to r do if Li Rj then Ak Li i i + 1 els

3、e Ak Rj j j + 1 图4、合并排序在不同数据规模下排序所消耗的时间4、快速排序代码5:quick(ele0.n-1,left,right)if lrlleft rright xelel;while lr while lr & x=eler /比x小则之后交换到前面的部分r- if lelel /比x大则前面交换到后面部分ll+ if l elerelel r- elelx; quick(ele,left,l-1) / 递归调用 quick(ele,l+1,right)图5、快速排序在不同数据规模下排序所消耗的时间5、插入排序代码6:for i=1n-1 if eleitemp el

4、ej+1elej elej+1temp图6、插入排序在不同数据规模下排序所消耗的时间三实验分析选择排序: 图7、由图2数据整合而成的折线图 表1、选择排序在不同数据规模下排序所消耗的时间数据规模:10100100010000100000耗时(ms)2.05195.2519868.5图形上:形状基本符合n2(二次增长)数据上:我们发现当数据规模增大10倍时:100010000: 195.25/2.05=95.24100 10000100000:19868.5/195.25=101.75100其他倍数也可得到类似的结果。结论:当数据规模为10和100时因为数据太小,耗时约为0。但当数据规模为100

5、0增大到10000时,并10000到100000时,规模增大10倍耗时都增大约100倍,可以计算出,选择排序的时间复杂度为o(n2)。冒泡排序:图8、由图3数据整合而成的折线图 表2、冒泡排序在不同数据规模下排序所消耗的时间0.12194.15197081001000:2/0.1=20 (误差太大)100010000:194.15/2=97.075 10010000100000:19708/194.15=101.5 100由于开始问题规模较小,产生误差较大,但随着问题规模的按10的倍数增大,耗时逐渐呈100的倍数增大,分析伪代码也可以算出该算法的时间复杂度为o(n2)。随着问题规模的增大,多种

6、误差会逐渐累积,耗时会超过o(n2)的倍数,但是整体上不会相差太大。与此相比,电脑等其他因素造成轻微的误差可以忽略不计。合并排序:图9、由图4数据整合而成的折线图表3、合并排序在不同数据规模下排序所消耗的时间0.76.0559.2形状基本符合n(线性增长):0.7/0.1=7 10(误差较大) 6.05/0.7=8.64 1059.2/6.05=9.78 10根据该算法的伪代码,可以计算出时间复杂度为o(nlog2n),当数据规模扩大10倍时,耗时呈线性增长,逐渐接近于n。当数据规模扩大n倍时,相应的在时间的消耗上会扩大nlog2n倍,同时我们发现,理论上乘以nlog2n后的数据普遍会略小于实

7、际数据,这主要原因快速排序需要递归调用,递归调用需要花费额外的时间。快速排序:图10、由图5数据整合而成的折线图表4、快速排序在不同数据规模下排序所消耗的时间1.512.15137.9512.15/1.5=8.1 10 137.95/12.15=10.1 10根据快速排序算法的伪代码,可以分析出该算法的时间复杂度是o(nlog2n),当数据规模扩大n倍时,相应的在时间的消耗上会扩大nlog2n倍。从实验的数据上,可以看出随着问题规模的增大,耗时上面也呈线性增长,但累积起来的误差也使得程序的结果略微高于实验值。总体上的实验结果和预期还是很接近的。插入排序:图11、由图6数据整合而成的折线图表5、

8、插入排序在不同数据规模下排序所消耗的时间1.2112.8511329.5 112.85/1.2=94 100 11329.5/112.85=100.4 100根据插入算法的伪代码,可以计算出该算法的时间复杂度是o(n2),当数据规模扩大n倍时,相应的在时间的消耗上会扩大n2倍,理论上,如果数据大具有特殊性,那此算法被影响的程度会比较大,他的的比较次数可以从线性次数,到n2次,赋值次数也可能由常数次变成n2总的来说,受数据影响较大。将五种排序的实验汇总在一起,如下图12所示图12、由图7、8、9、10、11整合而来 从图中以及之前的分析中我们可以得到以下结论1、在平均时间复杂度上面,冒泡排序、插

9、入排序和选择排序都最差为o(n2)。其主要原因是:随着问题规模的增大,冒泡排序在比较次数上达到了o(n2),但这种排序同时也受交换次数的影响,而且最多时间复杂度也是o(n2)。如此,同样是o(n2),但冒泡排序的二次项系数会比另外两个大不少,所以最为耗时。 2、快速排序和合并排序都表现出比较好的复杂度。但这两者中,合并排序表现更好。其原因是:在最坏情况下,即整个序列都已经有序且完全倒序的情况下,快速排序呈o(n2)的增长,而归并排序不管在什么情况下都呈o(nlog2n),随着问题规模的增大,快速排序逐渐体现出这种弊端。四实验心得本次实验虽然花费很大的心思,但确实让我对这几种排序的认识更加深刻,

10、同样的数据,排序的时间可以相差如此之大,这可能会改变我每次都使用冒泡排序的这一习惯,同时,对算法的优良性不同而导致的结果差异之大,感觉到好的算法是多么的重要,当然合理利用算法也是不可忽视的。这次实验虽然花了很大精力,却收获累累。指导教师批阅意见:成绩评定: 指导教师签字: 年 月 日备注:注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。附录:代码#includeiostreamwindows.h#include using namespace std;ctimefstream#define ARRAY_MAX 100

11、000/*生成随机函数*/void randNum(int MAX,int *array) /srand(unsigned)time(NULL); /cout生成的随机数为:endl; for(int i=0;MAX;i+) arrayi = rand()%100; /coutarrayi tt耗时:/*选择排序*/ void select_sort(int MAX,int *array) int i, j, k; for (i = 0; i MAX; i+) k = i; for (j = i + 1; j j+) if (arrayj arrayj) swap(arrayi,arrayj)

12、;/*合并排序*/void Merge(int *array, int p, int q, int r) int n1 = q - p + 1; int n2 = r - q; int *L, *R, i, j, k; L = new intn1 + 1; R = new intn2 + 1; n1; i+) Li = arrayp + i; n2; Ri = arrayq + 1 + i; Ln1 = INT_MAX; Rn2 = INT_MAX; for (i = 0, j = 0, k = p; k = r; k+) if (Li = Rj) arrayk = Li+; else arr

13、ayk = Rj+; delete L; delete R;void merge_sort(int *array, int p, int r) if (p = high) return; int first = low; int last = high; int key = afirst; while(first = key) -last; afirst = alast; /将比第一个小的数移到后面 afirst 0 & arrayj-1 temp;j-) arrayj = arrayj-1; arrayj = temp;int main() int n,loop = 1; while(loo

14、p != 0) /产生随机数组 clock_t time_start,time_end; double time_used = 0,count = 0; int MAX = 10; int arrayARRAY_MAX; coutn; switch(n) case 0: loop = 0;break; case 1: for(int j=0;j+) /控制问题规模MAX从10-100000 cout数组规模 MAX=MAX 时,耗时: srand(unsigned)time(NULL); for(int i=0;i+) /控制20组随机数产生 randNum(MAX,array); time_

15、start = clock(); select_sort(MAX,array); time_end = clock(); time_used = time_end - time_start; couttime_used /cout count += time_used; n选择排序平均耗时:count/20毫秒endl count = 0; MAX *= 10; break; case 2: buddle_sort(MAX,array);n冒泡排序平均耗时: case 3: for(int j=0; merge_sort(array,0,MAX-1);n合并排序平均耗时: break; case 4: for(int l=0;ll+) /控制问题规模MAX从10-100000 quick_sort(array,0,MAX);n快速排序平均耗时: case 5:

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

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