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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法排序问题实验报告.docx

1、算法排序问题实验报告排序问题求解实验报告1、算法得基本思想1、直接插入排序算法思想 直接插入排序得基本思想就是将一个记录插入到已排好序得序列中,从而得到一个新得,记录数增1 得有序序列。 直接插入排序算法得伪代码称为 Insertonor,它得参数就是一个数组 A1、n,包含了 n个待排序得数。用伪代码表示直接插入排序算法如下:Isrtont ()for i2 t no ei/key 表示待插入数/nsrt Ai nto hsrte equence A1、i-ji-1we j0 n jkeydo AjAjjj-1j+1ke2、快速排序算法思想 快速排序算法得基本思想就是,通过一趟排序将待排序序

2、列分割成独立得两部分,其中一部分记录得关键字均比另一部分记录得关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序序列为数组 A、n,首先选取第一个数0,作为枢轴(vt),然后按照下述原则重新排列其余数:将所有比 0大得数都排在它得位置之前,将所有比 A小得数都排在它得位置之后,由此以 A0最后所在得位置i 作为分界线,将数组A1、n分成两个子数组 1、i1与 +1、n。这个过程称作一趟快速排序。通过递归调用快速排序,对子数组A1、-1与 Ai1、n排序。 一趟快速排序算法得伪代码称为 Pattion,它得参数就是一个数组A、n与两个指针 o、high,设枢轴为vote,

3、则首先从 hig 所指位置起向前搜索,找到第一个小于ivtey得数,并将其移到低端,然后从 low 所指位置起向后搜索,找到第一个大于pivotkey 得数,并将其移到高端,重复这两步直至 low=igh。最后,将枢轴移到正确得位置上。用伪代码表示一趟快速排序算法如下:Partin ( , low,hig)AAlow用数组得第一个记录做枢轴记录priotkeylow/枢轴记录关键字wile lwigh /从表得两端交替地向中间扫描whle lowpivotey do hhig-1Alohigh /将比枢轴记录小得记录移到低端ile lowigh & Aowpivk)d lowlw+AhAo /

4、将比枢轴记录大得记录移到高端Aow /枢轴记录到位retnlow /返回枢轴位置2、算法得理论分析1、 直接插入排序算法理论分析从空间来瞧,直接插入排序只需要一个数得辅助空间;从时间来瞧,直接插入排序得基本操作为:比较两个关键字得大小与移动记录。先分析一趟直接插入排序得情况。伪代码Insertinrt中 while循环得次数取决于待插入得数与前 1 个数之间得关系。若AA,则在while 循环中,待插入数需与有序数组A、i-1中 i- 个数进行比较,并将 Ai-1中 i 个数后移。则在整个排序过程(进行 n-1 趟插入排序)中,当待排序数组中数按非递减有序排列时,则需进行数间比较次数达最小值

5、n-1,数不需要移动;反之,当待排序数组中数按非递增有序排列时,总得比较次数达最大值(n2)(n1)/2,数移动得次数也达到最大值(n+)(n-1)/2。若待排序数组就是随机得,即待排序数组中得数可能出现得各种排序得概率相同,则我们可取上述最小值与最大值得平均值,作为直接插入排序时所需进行数间得比较次数与数得移动次数,约为 n24。因此直接插入排序算法,在最佳情况下得时间复杂度就是O(n),在最坏情况下得时间复杂度为O(n2)。、快速排序算法理论分析下面我们来分析快速排序得平均时间性能。 假设 T(n)为对 n 个记录 A1、进行快速排序所需时间,则由算法ucSot可见:其中,Tpss()为对

6、n 个记录进行一趟快速排序 artiion(A,1,n)所需得时间,从一趟快速排序算法可见,其与记录数 n成正比,可以用 c 表示(c 为某个常数);T(k-1)与 (n-k)分别为对 A1、-1与 Ak1、中记录进行快速排序 QuickSor(A,-1)与QuiSort(A,k+1,n)所需时间。假设待排序列中记录就是随机排列得,则在一趟排序之后,k 取1 至 n 之间任何一值得概率相同,快速排序所需时间得平均值则为Tag(n)=nInn,其中 n 为待排序序列中记录得个数, 为某个常数。 通常,快速排序被认为就是,在所有同数量级(O(log)得排序方法中,其平均性能最好。但就是,若初始记录

7、序列按关键字有序或基本有序时,快速排序将蜕化为起泡排序,其时间复杂度为O(n2)。3、试验分析1、试验环境WN 32系统,V6、02、程序得执行1)由函数 datagenetare()生成 00 个在区间1,10000上得随机整数,并将随机整数保存到数组 nu,接着调用函数 ritele()将这些数输出到外部文件 da、xt 中。2)调用函数Readie()从 ata、tx 中读取数据,并将其保存到数组nu1中。接着对数组nu1 进行直接插入排序,并计算与记录其运行时间。最后,调用函数 ril()将直接插入排序得结果写入 rsltsIS、txt,并记录运行时间为 Tie。3)调用函数RedFi

8、l()从 ata、t 中读取数据,并将其保存到数组num2中。接着对数组 num 进行快速排序,并计算与记录其运行时间。最后,调用函数 WitFile()将快速排序得结果写入 reultsQS、txt,并记录运行时间为 TimeS。3、试验数据当N=000时:当N=3000时:当N000时:当N0000时:当=00时:当N=0000时:当N8000时:4、实验结果分析20插入排序、191、3972、193、04、57、46快速排序0、030、50、0080、10、010、0110、13做出折线统计图4、试验心得通过本次试验首先对在C+下得文件操作有了一定得深入认识,对于快速排序与插入排序得时间

9、有了相当清晰且一目了然得认识,并且从原理上明白了快速排序得快得原因,对各种排序算法得优劣性有了全局得认识!5、实验代码#ilude #includetim#le ctdlib#inclue#incude uing naspac sd;co int NumS = 80000;v aaenetae(nt u,int ); /产生随机数,保存到数组nmvoid Writenum,r name,int n);/输出数组um到data、t文件void Read num,car name);/读取名为nam文件中得数据,保存到数组numvoid Quickor(it arr, in n);/将数组ar中数

10、据快速排序voiInetionSot(itar,i n);/将数组arr中数据直接插入排序int ai()i num=(int *)lloc(sizo(in)NmS); int*nu1(it*)alloc(sizeo(int)*NumS);it nu2=( *)mloc(sieof(in)*NumS);clock_tstrt_tme1,en_ti1,tart_t2,nd_tim2;double timeQS=,meIS0;cotCete NmS ranomubsfom 1 to 10000en;dtgnetre(num,NumS); /产生随机数,保存到数组num rite,daa、x,NuS

11、); /输出数组到da、txt文件cout、recisin(); /设置浮点数得显示精度 cut、tf(is_bs:showpont); /输出末尾得 /直接插入排序得分析 Rea,t、tt);/读取a、txt中得数据,保存到数组num coutInsetonSrt Sat、; rttie=loc(); /开始计时 Insrtionort(num1,NumS); /直接插入排序数组num1中得数据 en_timelock(); /结束计时 teI=(dbl)(enime1start_tm1)/OC_SE; ouThe Ti-sptionn InetinSor is ie seconds!nn;

12、 /输出运行时间Wri,rsltIS、t,um); /排序后得数据输出到resultQS、txt /输出运行时间teS到utsIS、t ofteamoout;oout、op(reultsIS、txt,is:ap);if(oco、good() /打开esulsS、txt coutnThe ime-suptio n InsrtionSorttimeS secons; ocou、le(); else cutnan not open esultsIS、tx!; exi(1);/异常退出 /快速排序得分析 ead,data、xt);/读取dta、tt中得数据,保存到数组nu2oQuikSr Start、

13、n;stat_tie2=clock(); /开始计时uckort(n2,Num);/快速排序数组num中得数据 en_time2=clock(); /结束计时 iQS=(double)(end_time-tart_tim)/CLOCKS_PR_SEC;outThe ie-suption n QuickSrttimeQS secds:n; /输出运行时间 Wri,resuts、txt,NumS); /排序后得数据输出到resultQ、tt输出运行时间tmeQS到esusS、txocout、open(resultsQ、tt,ios:pp); i(ocout、d() /打开resultsI、txt

14、cotnThe Tiestin in QukSot smeQSsecodsn; oout、clos(); else cotCa not open esultsQ、xt!n; ext(1); /异常退出 rr 0;vod datgetare(in *num,it )nt i; srand((iged)tme(0)); rn()种子发生器函数,还有and()随机数生成器函数 or(=0;in;i+) /产生个到之间得随机数 uiran()%9999+1; pritf();/将数组中得数据输出到文件void ritnum,char name,in n)ostream oot; oout、en(nme

15、,ios:trnc); nt i=; if(cou、fl()) exit(); /打开文件失败,退出 fo(;in;+) ocutnumi ; if(i+)40=-) /每输出40个数,换一行 outn; ocout、lose();/将文件中得数据输入到数组vo Rad *nu,chaa)tring trLne; i i=0; chr chin300;nstcha* phTo;isreami; iin、ope(nae,os:in);/打开名为nae得文件 whil(ii、god()int i = 0; whle(line(icin,strLie) stLne、copy(achLne,strn、

16、ize(),); achLiestrLin、sie()=; /每行中得元素以空格为标识断开转换为i类型后存入数组 pchTok tro(acLn, ); hile(pchTok != NULL) numi = aoi(chok);i+; hTok =strtok(UL,); cin、close();/快速排序得实现,从左向右递增排序voidQckSr(int rr,nt )itL 0; int R -1;int t = arr; /区间得第一个数作为基准if(=1) 数组中存在个或个数据时,函数返回 reurn;/将数据分成两个区间 wil(R) /区间内至少存在一个元素得情况 whil(L&

17、t=arR) R-;/从右向左搜索,直到第一个小于得数arR arrL = arrR; hi(L&arrL=t) L+;从左向右搜索,找到第一个大于得数arL arrR arL;rrL = t; Quickor(ar, L); /对左区间递归排序 Quickot(ar+L+1,n-1);/对右区间递归排序/直接插入排序得实现,从左向右递增排序voisertionot(int *ar,int)nt i=,em=,=0;if(n=) rturn;for(i=1;0&arrj1temp;-) /将插入到已排序得ar0ari-1中 arj=arj-1; /比tem大得数据依次后移 rrj=tep; /找到第一个不大于于p得数据,在j处插入ari

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

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