ImageVerifierCode 换一换
格式:DOCX , 页数:49 ,大小:1.03MB ,
资源ID:2609363      下载积分:12 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

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

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【人****来】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【人****来】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(数据结构优秀课程设计快速排序.docx)为本站上传会员【人****来】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

数据结构优秀课程设计快速排序.docx

1、 数据结构课程设计汇报 快速排序详析专业物联网工程学生姓名方振华班级152学号指导老师刘 骞完成日期12月22日目 录一、介绍1二、算法说明1三、测试结果7四、分析和探讨9五、数据异常测试案例15六、小结17七、参考文件18八、源程序清单18快速排序详析一、 介绍排序是计算机程序设计中常见数据处理操作。经过一学期数据结构学习,我们学到很多个排序方法,如插入排序、交换排序、选择排序、归并排序、技术排序等。经过分析和对比,我们总结出一个快速排序优化版本,并对其设计思想和具体实现进行详解。二、 算法说明1、多种排序算法方法性能比较图1:多种排序算法方法性能比较(1)就时间性能而言,快速排序,堆排序和

2、归并排序全部有很好时间性能。相对而言,快速排序速度最快,不过快速排序在最坏情况下,时间性能达成了O(n2),不如堆排序和归并排序快。(2)就空间性能而言,直接插入排序,冒泡排序,简单选择排序,堆排序要求辅助空间比较小。其中直接插入排序,冒泡排序,简单选择排序比较简单,轻易实现,但时间性能较差。快速排序是一个有效排序算法。即使算法在最坏情况下运行时O(n2),但因为平均运行时间为O(nlogn),而且在内存使用、程序实现复杂性上表现优异,尤其是对快速排序算法进行随机化可能,使得快速排序在通常情况下是最实用排序方法之一。快速排序被认为是目前最优异内部排序方法,其基础思想是经过一趟排序将待排统计分割

3、成独立两部分,其中一部分统计关键词比另一部分统计关键词小,则可分别对这两部分统计进行排序,以达成整个序列有序。2、步骤快速排序基础算法Quicksort(S)由以下4个步骤组成:(1).假如S中元素数目为0或一,则返回。(2).选择S中任意一个元素v,v叫做支点(Pivot)。(3).将S-v(剩下元素在S中)分成两个分开部分。全部小于v元素和全部大于v元素。(4).依次返回Quicksort(L),v和Quicksort结果基础快速排序算法能够应用递归实现,关键细节包含支点选择和怎样分组。该算法许可把任何元素作为支点。支点把数组分为两组,图2展示了算法基础过程。图2:算法基础过程3、分析最好

4、情况:快速排序最好情况是支点把集合分成两个相同大小子集而且在递归每个阶段全部这么划分。然后就有了两个通常大小递归调用和线性分组开销。在这种情况下运行时间复杂度是O(nlog2n)。最坏情况:假设在每一步递归调用中支点全部恰好是最小元素。这么小元素集合L就是空而大元素集合R拥有除了支点以外全部元素。设T(N)是对N各元素惊醒快速排序所需运行时间按并假设对0或1各元素排序时间刚好是1个时间单位。那么对因为N1当每次全部运气很差地最小元素作为支点得到原型时间满足T(N)=T(N-1)+N.即对N各项进行排序时间等于递归排序大元素子集中N-1各项所需要时间加上进行分组N个单位开销。最终得出T(N)=T

5、(1)+2+3+N=N(N+1)/2=O(N2) 支点选择:错误方法:比较常见不明智选择就是把第一个元素作为支点。但假如输入是已经预先排过序,或是倒序,该支点给出分组就很糟,因为它是一个末端元素;而且这种情况会在迭代中继续出现,会以O(N2)时间复杂度而告终,所以选择第一个元素作为支点不是好策略。 中位选择:把中间元素即待排序序列中间位置元素作为支点是合理选择。当输入已经排过序时这种选择在每次递归调用中全部会给出理想支点。 中值划分:在上诉选择中使用中间值作为支点能够消除非随机输入时出现退化情况。但这是一个消极选择,就是说仅仅是试图避免一个坏支点而并没有去尝试选择一个愈加好支点。中值划分是一个

6、选择比平均情况愈加好支点尝试。在中值划分中,一个比较简单而有效策略是选择待排序列第一个、中间一个和最好一个统计这3个值中值作为支点。一样道理,也能够从待排序列中等距离地选择5各值,并将这5各值中值作为支点。 4、 程序设计本试验目标是设计并实现一个快速排序Quicksort优化版本,而且比较在下列组合情况下算法性能表现 (1) cutoff值从020。Cutoff值作用是只有当数组长度小于等于这个值时才使用另一个简单排序方法对其排序不然使用Quicksort算法排序。 (2) 选定支点方法分别是“第一个元素”“三个元素中值”“五个元素中值”。 程序关键由6部分组成,分别是:(1)程序入口mai

7、n函数;(2)Quicksort,快速排序算法实现部分;(3)MedianOf3,选择三个值中值作为中点;(4)MedianOf5,选择五个值中点作为支点;(5)Swap,简单地交换两个元素值;(6)Insertion,在数组长度小于cutoff值时使用插入排序来替换快速排序。三、 测试结果改完相关错误后运行代码,运行结果(图4所表示),在相关文件中新建文本文件,文件命名为”input.txt“。在文本文件中,打入输入数据,得出下列截图(图)。图三:建立input并输入回到程序,程序运行。图四:程序运行输入数据并确定。图五:程序运行完成查看output文件。四、 分析和探讨关键函数分析:Mai

8、n函数:int main()int i, group = 0, numbOFelements, elements, Amount;int Array10000;int cutoff = 0;FILE *InputPTR, *OutputPTR; /* input和output文件指针 */InputPTR = fopen(input.txt, r+);OutputPTR = fopen(output.txt, w+);if (InputPTR = NULL) /* 检验input文件是否存在 */W+;InitGameBoard();putin();if (median != 1) & (me

9、dian != 3) & (median != 5)N+;putin();start = GetTickCount();Amount = fscanf(InputPTR, %d, &numbOFelements); /* 读取每次迭代元素个数 */while (Amount != EOF) /* 当读到不是文件末尾 */start1 = GetTickCount();group+;fprintf(OutputPTR, Case number: %dnNumber of elements: %dn,group, numbOFelements); /*输出格式 */for (i = 0;inumb

10、OFelements;i+) fscanf(InputPTR, %d, &Arrayi); /*将输入读入到数组中 */fgetc(InputPTR);fgetc(InputPTR);QuickSort(Array, 0, numbOFelements - 1, cutoff, median); /*给数组排序 */for (i = 0;inumbOFelements;i+)fprintf(OutputPTR, %d , Arrayi); /*打印排序后数组 */stop1 = GetTickCount();tim1 = stop1 - start1;fprintf(OutputPTR, n

11、本组数据消耗时间为:%d ms , tim1);tim = tim1+tim;Amount = fscanf(InputPTR, %d, &numbOFelements);fprintf(OutputPTR, nn);fclose(InputPTR);fclose(OutputPTR);stop = GetTickCount();InitGameBoard();return 0;Main函数关键内容:打开input.txt和output.txt文件;读入数个数n;从文件中次序读入n个数,并放到数组中;应用Quicksort对该数组排序;将排序后数输出到文件output.txt中;读入下一组数个

12、数,继续上述过程;关闭文件。QuickSort函数:void QuickSort(int Array, int min, int max, int cutoff, int median)/*median=1时使用第一个值作为支点median=3时使用三个值中值作为支点median=5时使用五个值中值作为支点*/int low, high, Pivot;if (max - min) = 0)return; /* 假如数组中没有元素 */if (min + cutoff = median) /* 检验cutoff值是否适宜 */if (median = 1) Swap(&Arraymin, &Ar

13、raymax);Pivot = Arraymax;else if (median = 3) /* 调用函数MedianOf3 */Pivot = MedianOf3(Array, min, max);else if (median = 5) /*调用函数MedianOf5 */Pivot = MedianOf5(Array, min, max);low = min; high = max;for (; ; )while (Arraylow Pivot) /* 跳过比支点大值 */if (low high) /* 交换两个值 */Swap(&Arraylow, &Arrayhigh);else

14、/* 假如指针重合了,则跳出循环 */break;Swap(&Arraylow, &Arraymax);QuickSort(Array, min, low - 1, cutoff, median); /* 分成两部分递归调用快速排序 */QuickSort(Array, low + 1, max, cutoff, median);else InsertionSort(Array, min, max); /* 对剩下数组进行插入排序 */Quicksort函数 参数:待排数组,待排段起点位置,待排段终点位置,cutoff值,支点选择方法 If数组时空 Exit If待排数段元素个数大于等于cut

15、off值,且元素个数大于等于支点选择方法所要求元素个数依据支点选择方法选择一个元素作为支点 设置low为起点值、high为终点值 While low=high While low位置值小于支点值 Low+ ;While high位置值大于支点值 High;If lowhigh 交换low、high两个元素 将low位置元素和支点元素交换 Quicksort递归调用左半段 Quicksort递归调用右半段 Else 应用直接插入排序法对数组元素排序 MedianOf3:选择三个值中值作为中点;MedianOf5:选择五个值中点作为支点;Swap:简单地交换两个元素值;Insertion:在数组长

16、度小于cutoff值时使用插入排序来替换快速排序。五、 数据异常测试案例1. 没有配置input文件处理方法:在特定文件夹创建input文件并输入数值保留。2. 输入数值有误处理方法;回到input文件输入正确数值。六、 小结经过这次课程设计,深入加深了我对多种排序算法认识,尤其是快速排序算法。每种排序算法全部有其不足,我们在编写程序时要用其优点。不足之处我们能够使用其它算法进行替换。从而在时间上取得愈加好效益。即使这次课程设计已经有现成代码不过我从代码中学到了部分东西,比如对文件读写操作。以前我极少会将程序输出结果以文本格式存放起来。我认为我在数据结构这门课上还需要花很多时间,以前只学习理论

17、知识,现在应用到实践真花费了很大力气,还需继续努力。我同时体会到了团体合作关键性,从最初查阅资料到最终程序成功运行,和其说是学习,不如说它是合作精神和毅力考验。经过这次课程设计,我们不仅学到了很多知识和技能,更关键是团体合作。最终,在这次实训过程中,我们深刻认识到了自己在学习方面不足之处,我知道我还有太多基础思想没有真正了解,当然我们不会气馁,我们会在以后日子里努力填补我们不足。七、 参考文件1何钦铭 陈根才 数据结构课程设计 浙江大学出版社 8月2 谭浩强.C程序设计(第三版).清华大学出版社,7月3 严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社,1997年4月八、 源程序清单#de

18、fine _CRT_SECURE_NO_DEPRECATE#undef UNICODE#undef _UNICODE#include#include#include#include#include#include#include#include#define SIZE 10000 /* 数组最大容量 */#define NameMaxLength 12 /设定用户名最大字符数为:NameMaxLength-2#define PsdMaxLength 10 /设定密码最大字符数#define boxbkclr 0xfedcbd /绘制消息框和登录框专题填充颜色#define drawFieldb

19、kclr 0xFFFFFF /窗口区域背景填充颜色/*-和算法相关函数和定义-*/int MedianOf3(int a, int low, int high);int MedianOf5(int a, int low, int high);void Swap(int *a, int *b);void QuickSort(int a, int left, int right, int cutoff, int median);void InsertionSort(int a, int low, int high);int median;int cutoff;/*-和界面相关函数和定义-*/voi

20、d DrawMsgBox();void InitGameBoard();void putin();void InputName(); /输入账号void InputPsd(); /输入密码int xb00 = 0, xb01 = 0, xb02 = 0, xb03 = 0, xb04 = 0, xb05 = 0;/控件(按钮或输入框)位置坐标int yb00 = 0, yb01 = 0, yb02 = 0, yb03 = 0, yb04 = 0, yb05 = 0;/控件(按钮或输入框)位置坐标int T = 0;int W = 0;int N = 0;int start, start1, s

21、top, stop1;int tim=0,tim1;char IptNameNameMaxLength = , , , , , , ,0 ;char IptPsdPsdMaxLength = , , , , , , ,0 ;int ResponseMouse(int xb0, int yb0, int xb1, int yb1, int xb2, int yb2, int xb3, int yb3, int xb4, int yb4, int xb5, int yb5)int place = -1;MOUSEMSG m;/定义鼠标消息while (true)m = GetMouseMsg();

22、/获取一条鼠标消息if (m.uMsg = WM_LBUTTONDOWN)if (xb0 = -1)/在绘图区域任意点击place = 0;break;/单击第一个对象if (m.xxb0) & (m.xyb0) & (m.yxb2) & (m.xyb2) & (m.yyb3)place = 2;break;/单击第三个对象return place;/返回鼠标点击对象/*-主函数-*/int main()int i, group = 0, numbOFelements, elements, Amount;int Array10000;int cutoff = 0;FILE *InputPTR,

23、 *OutputPTR; /* input和output文件指针 */InputPTR = fopen(input.txt, r+);OutputPTR = fopen(output.txt, w+);if (InputPTR = NULL) /* 检验input文件是否存在 */W+;InitGameBoard();putin();if (median != 1) & (median != 3) & (median != 5)N+;putin();start = GetTickCount();Amount = fscanf(InputPTR, %d, &numbOFelements); /*

24、 读取每次迭代元素个数 */while (Amount != EOF) /* 当读到不是文件末尾 */start1 = GetTickCount();group+;fprintf(OutputPTR, Case number: %dnNumber of elements: %dn,group, numbOFelements); /*输出格式 */for (i = 0;inumbOFelements;i+) fscanf(InputPTR, %d, &Arrayi); /*将输入读入到数组中 */fgetc(InputPTR);fgetc(InputPTR);QuickSort(Array, 0

25、, numbOFelements - 1, cutoff, median); /*给数组排序 */for (i = 0;iamid) Swap(&alow, &amid);if (alowahigh) Swap(&alow, &ahigh);if (amidahigh) Swap(&amid, &ahigh);Swap(&amid, &ahigh); /* 交换排序后中间元素和最终元素值 */return ahigh;/*支点(pivot)选择五个值中值算法*/int MedianOf5(int a, int low, int high)int i, temp, j, largest;int

26、Step;Step = (high - low) / 4; /* 设定步长为四分之一,这么便能选出五个元素 */for (j = 0; j4; +j)largest = high - j*Step; /*每次迭代选择不一样值作为最大值 */for (i = j + 1; ialargest)largest = high - i*Step; /* 设定新最大值 */Swap(&ahigh - j*Step, &alargest); /* 将每次找到最大值放在每次对应位置 */Swap(&ahigh - Step - Step, &ahigh); /* 将选定支点放到最终面 */Swap(&ahi

27、gh - 3 * Step, &alow);return ahigh;/*交换两个元素*/void Swap(int *a, int *b)int temp = *a;*a = *b;*b = temp;/*插入排序*/void InsertionSort(int a, int min, int max)int j, i, temp;for (i = min;i min & aj - 1temp;j-)aj = aj - 1;aj = temp;/*快速排序*/void QuickSort(int Array, int min, int max, int cutoff, int median)

28、/*median=1时使用第一个值作为支点median=3时使用三个值中值作为支点median=5时使用五个值中值作为支点*/int low, high, Pivot;if (max - min) = 0)return; /* 假如数组中没有元素 */if (min + cutoff = median) /* 检验cutoff值是否适宜 */if (median = 1) Swap(&Arraymin, &Arraymax);Pivot = Arraymax;else if (median = 3) /* 调用函数MedianOf3 */Pivot = MedianOf3(Array, min

29、, max);else if (median = 5) /*调用函数MedianOf5 */Pivot = MedianOf5(Array, min, max);low = min; high = max;for (; ; )while (Arraylow Pivot) /* 跳过比支点大值 */if (low high) /* 交换两个值 */Swap(&Arraylow, &Arrayhigh);else /* 假如指针重合了,则跳出循环 */break;Swap(&Arraylow, &Arraymax);QuickSort(Array, min, low - 1, cutoff, me

30、dian); /* 分成两部分递归调用快速排序 */QuickSort(Array, low + 1, max, cutoff, median);else InsertionSort(Array, min, max); /* 对剩下数组进行插入排序 */*-和界面相关函数-*/*按键设置*/void InitGameBoard()int choice;/点击了哪个按钮char str_regist = 退出程序;initgraph(500, 500);setorigin(0, 0);/设置绘图窗口区域左上角为逻辑坐标原点setbkcolor(0xFFFFFF);/设置背景颜色,0xFFFFFF

31、为白色DrawMsgBox();/绘制开启画面上两个按钮choice = ResponseMouse(xb00, yb00, xb01, yb01, xb02, yb02, xb03, yb03, xb04, yb04, xb05, yb05);if (choice = 1)exit(0);/*结束界面*/void DrawMsgBox()int xb0, xb1, yb0, yb1;xb0 = xb1 = yb0 = yb1 = 0;int w = 500;/消息框宽度为wint h = 500;/消息框高度为hint btnw = 80;/按钮宽度为btnwint btnh = 30;/按

32、钮高度为btnhchar timc6;setlinecolor(RGB(135, 206, 250);/设置线条颜色setfillcolor(RGB(135, 206, 250);/设置填充颜色fillroundrect(500 - w) / 2, (500 - h) / 2, (500 + w) / 2, (500 + h) / 2, 20, 20);/用颜色填充矩形xb0 = 500 / 2 - btnw / 2;/按钮1位置坐标yb0 = 500 / 2 - btnh / 2;/按钮1位置坐标xb1 = 500 / 2 + btnw / 2;/按钮1位置坐标yb1 = 500 / 2 +

33、 btnh / 2;/按钮1位置坐标xb00 = xb0;xb01 = xb1;yb00 = yb0;yb01 = yb1;setlinecolor(WHITE);setfillcolor(RGB(135, 206, 250);fillroundrect(xb0, yb0, xb1, yb1, 10, 10);/用颜色填充按钮1setcolor(RED);setbkmode(TRANSPARENT);/设置文字输出时背景模式为透明色settextstyle(28, 0, _T(楷体);if (W = 1)outtextxy(150, 150, 没有找到input文件);elseouttextx

34、y(100, 100, 感谢使用);outtextxy(200, 150, 优化排序已经完成);_itoa_s(tim, timc, 10);/数字转化为字符outtextxy(2, 300, 所消耗总时间为:);outtextxy(300, 300, timc);settextstyle(18, 0, _T(楷体);outtextxy(xb0 + 6, yb0 + 6, 退出程序);/*cutoff输入*/void putin()IMAGE img;initgraph(500, 462);int xb0, xb1, xb2, xb3, xb4, xb5, yb0, yb1, yb2, yb3

35、, yb4, yb5, x10, y10, x11, y11;xb0 = xb1 = xb2 = xb3 = xb4 = xb5 = yb0 = yb1 = yb2 = yb3 = yb4 = yb5 = x10 = y10 = x11 = y11 = 0;int choice;/点击了哪个按钮int w = 360;/消息框宽度为wint h = 180;/消息框高度为hint btnw = 210;/输入框、按钮宽度为btnwint btnh = 30;/输入框、按钮高度为btnhx10 = (470 - w) / 2;y10 = (462 - h) / 2;x11 = (470 + w)

36、 / 2;y11 = (462 + h) / 2;cleardevice();setlinecolor(boxbkclr);setfillcolor(boxbkclr);xb0 = x10 + btnw / 2;yb0 = y10 + btnh;xb1 = xb0 + btnw;yb1 = yb0 + btnh;xb2 = xb0;yb2 = yb1 + btnh / 2;xb3 = xb1;yb3 = yb2 + btnh;xb4 = xb0;yb4 = yb3 + btnh / 2;xb5 = xb1;yb5 = yb4 + btnh;xb00 = xb0;xb01 = xb1;xb02 = xb2;xb03 = xb3;yb00 = yb0;yb01 = yb1;yb02 = yb2;yb03 = yb3;xb04 = xb4;xb

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服