收藏 分销(赏)

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

上传人:人****来 文档编号:2609363 上传时间:2024-06-03 格式:DOCX 页数:49 大小:1.03MB
下载 相关 举报
数据结构优秀课程设计快速排序.docx_第1页
第1页 / 共49页
数据结构优秀课程设计快速排序.docx_第2页
第2页 / 共49页
数据结构优秀课程设计快速排序.docx_第3页
第3页 / 共49页
数据结构优秀课程设计快速排序.docx_第4页
第4页 / 共49页
数据结构优秀课程设计快速排序.docx_第5页
第5页 / 共49页
点击查看更多>>
资源描述

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

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 学术论文 > 其他

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

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

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

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

gongan.png浙公网安备33021202000488号   

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

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

客服