各种排序算法课程设计报告.docx
- 文档编号:4499275
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:24
- 大小:100.18KB
各种排序算法课程设计报告.docx
《各种排序算法课程设计报告.docx》由会员分享,可在线阅读,更多相关《各种排序算法课程设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
各种排序算法课程设计报告
封面
本科学生课程设计任务书
课程设计题目
内部排序算法比较
学院
软件学院
专业
软件工程
年级
2008级
已知参数和设计要求:
[问题描述]
各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。
试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
学生应完成的工作:
[基本要求]
(1)对以下10种常用的内部排序算法进行比较:
直接插入排序;折半折入排序;二路插入排序;希尔排序;起泡排序;快速排序;简单选择排序;堆排序;归并排序;基数排序。
(2)待排序表的表长不少于100;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字移动次数(关键字交换计为3次移动)。
[测试数据]
由随机产生器决定。
目前资料收集情况(含指定参考资料):
《C++数据结构与程序设计》RobertL.KruseAlexanderJ.Ryba北京,清华大学出版社,2004.1
课程设计的工作计划:
先制作规划大纲,在从基础的表开始做,再研究核心的算法,各种排序函数的实现,最后用其他辅助类用于实现效率的比较,和测试数据的产生。
最后在优化程序,添加注释。
任务下达日期2010年4月26日
完成日期2010年5月30日
指导教师(签名)
学生(签名)
说明:
1、学院、专业、年级均填全称,如:
光电工程学院、测控技术、2003
重庆大学本科学生课程设计任务书
课程设计题目
学院
专业
年级
已知参数和设计要求:
学生应完成的工作:
目前资料收集情况(含指定参考资料):
课程设计的工作计划:
任务下达日期年月日
完成日期年月日
指导教师(签名)
学生(签名)
说明:
1、学院、专业、年级均填全称,如:
光电工程学院、测控技术、2003。
2、本表除签名外均可采用计算机打印。
本表不够,可另附页,但应在页脚添加页码。
重庆大学本科学生课程设计任务书
课程设计题目
学院
专业
年级
已知参数和设计要求:
学生应完成的工作:
目前资料收集情况(含指定参考资料):
课程设计的工作计划:
任务下达日期年月日
完成日期年月日
指导教师(签名)
学生(签名)
说明:
1、学院、专业、年级均填全称,如:
光电工程学院、测控技术、2003。
2、本表除签名外均可采用计算机打印。
本表不够,可另附页,但应在页脚添加页码。
重庆大学本科学生课程设计任务书
课程设计题目
学院
专业
年级
已知参数和设计要求:
学生应完成的工作:
目前资料收集情况(含指定参考资料):
课程设计的工作计划:
任务下达日期年月日
完成日期年月日
指导教师(签名)
学生(签名)
说明:
1、学院、专业、年级均填全称,如:
光电工程学院、测控技术、2003。
2、本表除签名外均可采用计算机打印。
本表不够,可另附页,但应在页脚添加页码。
摘要
本文主要针对各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。
试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受,对各种算法比较次数和移动次数的比较,针对各种不同数组如何选择更高效的排序方法,给出一定的指导。
各种算法的稳定性也至关重要,对于各种不同类型的数据,各种算法的效果有明显差异,所以针对每种算法,都有不同的数据与之对应,该稳定性表明算法的稳定程度。
有效时间则为各种算法针对每组数据实际用掉的计算机时间,可以分析各种排序算法的时间效率。
关键字时间复杂度有效时间稳定性
一问题重述
1.1问题描述
各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。
试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
1.2基本要求
(1)对以下10种常用的内部排序算法进行比较:
直接插入排序;折半折入排序;二路插入排序;希尔排序;起泡排序;快速排序;简单选择排序;堆排序;归并排序;基数排序。
(2)待排序表的表长不少于100;其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字移动次数(关键字交换计为3次移动)。
二算法构建
2.1算法思想
所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。
当待排序记录的关键字都不相同时,排序结果是惟一的,否则排序结果不惟一。
在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的。
要注意的是,排序算法的稳定性是针对所有输入实例而言的。
即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。
2.1.1插入排序
插入排序的基本思想是每步将一个待排序的记录按其排序码值的大小,插到前面已经排好的文件中的适当位置,直到全部插入完为止。
插入排序方法主要有直接插入排序和希尔排序。
①.直接插入排序(稳定)
接插入排序的过程为:
在插入第i个记录时,R1,R2,..Ri-1已经排好序,将第i个记录的排序码Ki依次和R1,R2,..,Ri-1的排序码逐个进行比较,找到适当的位置。
使用直接插入排序,对于具有n个记录的文件,要进行n-1趟排序。
②.希尔排序(不稳定):
希尔(Shell)排序的基本思想是:
先取一个小于n的整数d1作为第一个增量把文件的全部记录分成d1个组。
所有距离为d1的倍数的记录放在同一个组中。
先在各组内进行直接插入排序;然后,取得第二个增量d2 该方法实质上是一种分组插入方法。 一般取d1=n/2,di+1=di/2。 如果结果为偶数,则加1,保证di为奇数。 希尔排序是不稳定的,希尔排序的执行时间依赖于增量序列,其平均时间复杂度为O(n^1.3). 2.1.2.选择排序 选择排序的基本思想是每步从待排序的记录中选出排序码最小的记录,顺序存放在已排序的记录序列的后面,直到全部排完。 选择排序中主要使用直接选择排序和堆排序。 ①.直接选择排序(不稳定) 直接选择排序的过程是: 首先在所有记录中选出序码最小的记录,把它与第1个记录交换,然后在其余的记录内选出排序码最小的记录,与第2个记录交换......依次类推,直到所有记录排完为止。 无论文件初始状态如何,在第i趟排序中选出最小关键字的记录,需要做n-i次比较,因此,总的比较次数为n(n-1)/2=O(n^2)。 当初始文件为正序时,移动次数为0;文件初态为反序时,每趟排序均要执行交换操作,总的移动次数取最大值3(n-1)。 直接选择排序的平均时间复杂度为O(n^2)。 直接选择排序是不稳定的。 ②.堆排序(不稳定) 堆排序是一种树形选择排序,是对直接选择排序的有效改进。 n个关键字序列 K1,K2,...,Kn称为堆,当且仅当该序列满足(Ki<=K2i且Ki<=K2i+1)或(Ki>=K2i且Ki>=K2i+1),(1<=i<=n/2)。 根结点(堆顶)的关键字是堆里所有结点关键字中最小者,称为小根堆;根结点的关键字是堆里所有结点关键字中最大者,称为大根堆。 若将此序列所存储的向量R[1..n]看作是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树: 树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。 堆排序的关键步骤有两个: 一是如何建立初始堆;二是当堆的根结点与堆的最后一个结点交换后,如何对少了一个结点后的结点序列做调整,使之重新成为堆。 堆排序的最坏时间复杂度为O(nlog2n),堆排序的平均性能较接近于最坏性能。 由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录较少的文件。 堆排序是就地排序,辅助空间为O (1),它是不稳定的排序方法。 2.1.3交换排序 交换排序的基本思想是: 两两比较待排序记录的排序码,并交换不满足顺序要求的那写偶对,直到满足条件为止。 交换排序的主要方法有冒泡排序和快速排序. ①.冒泡排序(稳定的) 冒泡排序将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为ki的气泡。 根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R;凡扫描到违反本原则的轻气泡,就使其向上"漂浮"。 如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。 冒泡排序的具体过程如下: 第一步,先比较k1和k2,若k1>k2,则交换k1和k2所在的记录,否则不交换。 继续对k2和k3重复上述过程,直到处理完kn-1和kn。 这时最大的排序码记录转到了最后位置,称第1次起泡,共执行n-1次比较。 与第一步类似,从k1和k2开始比较,到kn-2和kn-1为止,共执行n-2次比较。 依次类推,共做n-1次起泡,完成整个排序过程。 若文件的初始状态是正序的,一趟扫描即可完成排序。 所需关键字比较次数为n-1次,记录移动次数为0。 因此,冒泡排序最好的时间复杂度为O(n)。 若初始文件是反序的,需要进行n-1趟排序。 每趟排序要进行n-i次关键字的比较(1<=i<=n-1),且每次比较都必须移动记录三次来达到交换记录位置。 在这种情况下,比较次数达到最大值n(n-1)/2=O(n^2),移动次数也达到最大值3n(n-1)/2=O(n^2)。 因此,冒泡排序的最坏时间复杂度为O(n^2)。 虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均性能比直接插入排序要差得多。 冒泡排序是就地排序,且它是稳定的。 ②.快速排序: (不稳定的) 快速排序采用了一种分治的策略,通常称其为分治法,其基本思想是: 将原问题分解为若干个规模更小但结构与原问题相似的子问题。 递归地解这些子问题,然后将这些子问题的解组合为原问题的解。 快速排序的具体过程如下: 第一步,在待排序的n个记录中任取一个记录,以该记录的排序码为准,将所有记录分成两组,第1组各记录的排序码都小于等于该排序码,第2组各记录的排序码都大于该排序码,并把该记录排在这两组中间。 第二步,采用同样的方法,对左边的组和右边的组进行排序,直到所有记录都排到相应的位置为止。 2.1.4归并排序 归并排序是将两个或两个以上的有序子表合并成一个新的有序表。 初始时,把含有n个结点的待排序序列看作由n个长度都为1的有序子表组成,将它们依次两两归并得到长度为2的若干有序子表,再对它们两两合并。 直到得到长度为n的有序表,排序结束。 归并排序是一种稳定的排序,可用顺序存储结构,也易于在链表上实现,对长度为n的文件,需进行log2n趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlog2n)。 归并排序需要一个辅助向量来暂存两个有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序。 五.基数排序 设单关键字的每个分量的取值范围均是C0<=Kj<=Crd-1(0<=j<=rd),可能的取值个数rd称为基数.基数的选择和关键字的分解因关键字的类型而异. (1).若关键字是十进制整数,则按个、十等位进行分解,基数rd=10,C0=0,C9=9,d为最长整数的位数. (2).若关键字是小写的英文字符串,则rd=26,C0='a',C25='z',d为最长字符串的长度. 基数排序的基本思想是: 从低位到高位依次对待排序的关键码进行分配和收集,经过d趟分配和收集,就可以得到一个有序序列. 2.2模块划分 Classmylist 顺序表类,用于存储将要排序的数据。 Size()返回表中数据的大小; Full()判断表是否满; Empty()判断表是否空; Clear()重置表为空; Traverse()遍历表中每一个元素; Retrieve()返回表中指定的元素; Replace()替换表中指定的元素; Remove()移除表中指定的元素; Insert()在指定的位置插入指定元素; ClassKey 键类,用于表中的数据,使之可比较,即每个元素都有一个与之相关联的Type类型数据。 Initialize()初始化键类; Operator重载运算符; ClassRandom 随机数类,随机产生一组数。 Random()构造函数; Random_Internet()产生随机整数函数; Random_real()产生随机实数函数; Reseed()重置种子函数,为time()提供非伪随机数的种子; Classsortable_list 可排序的顺序表,继承与顺序表; insertion_sort()插入排序函数; selection_sort()选择排序函数; quick_sort()快速排序函数; merge_sort()归并排序函数; heap_sort()堆排序函数; scan_sort()基数排序函数; insertion_binary()二路插入排序函数; bubble_sort()冒泡排序函数; shell_sort()希尔排序函数; classTimer 时间类,用于计算各种排序所运行的时间; Reset()重置时间; Elapsed_time()停止计时并返回时间; 2.3数据结构 顺序表结构类型 classmylist{ public: //methodsoftheListADT mylist(); intsize()const; boolfull()const; boolempty()const; voidclear(); voidtraverse(void(*visit)(List_entry&)); Error_coderetrieve(intposition,List_entry&x)const; Error_codereplace(intposition,constList_entry&x); Error_coderemove(intposition,List_entry&x); Error_codeinsert(intposition,constList_entry&x); protected: //datamembersforacontiguouslistimplementation intcount; List_entryentry[10000]; }; 键数据类型 classKey{ intkey; public: staticintcomparisons; staticintassignments; staticvoidinitialize(); staticintcounter(); Key(intx=0); intthe_key()const; Key&operator=(constKey&y); }; booloperator==(constKey&y,constKey&x); booloperator! =(constKey&y,constKey&x); booloperator>=(constKey&y,constKey&x); booloperator<=(constKey&y,constKey&x); booloperator>(constKey&y,constKey&x); booloperator<(constKey&y,constKey&x); 随机数数据类型 classRandom{ public: Random(boolpseudo=true); intrandom_integer(intlow,inthigh); doublerandom_real(); private: intreseed();//Re-randomizetheseed. intseed, multiplier,add_on;//constantsforuseinarithmeticoperations }; 可排序的顺序表数据类型 template classsortable_list: publicmylist { public: sortable_list(): mylist voidinsertion_sort(); voidselection_sort(); voidswap(intlow,inthigh); intmax_key(intlow,inthigh); voidquick_sort(); voidrecursive_quick_sort(intlow,inthigh); intpartition(intlow,inthigh); voidmerge_sort(); voidrecursive_merge_sort(intlow,inthigh); voidmerge(intlow,inthigh); voidheap_sort(); voidinsert_heap(constList_entry¤t,intlow,inthigh); voidbuild_heap(); voidscan_sort(); voidinsertion_binary(); voidbubble_sort(); voidshell_sort(); voidsort_interval(intstart,intincrement); }; 计算机时间数据类型 classTimer { public: Timer(); doubleelapsed_time(); voidreset(); private: clock_tstart_time; }; 三算法实现 源程序 #include #include"sortable_list.h" #include"Timer.h" #include"Random.h" usingnamespacestd; sortable_list sortable_list voidwrite_entry(Key&c) { cout<<((Key)c).the_key()<<""; } voidhelp()////帮助函数 { cout<<"Useroptionsare: \n" <<"[H]elp[Q]uit(re)[F]illlist\n" <<"write[D]atawritesorted[O]utput\n" <<"[0]insertionsort---Project2P1d\n" <<"[1]selectionsort---Project3P1\n" <<"[2]shellsort---Project4P2\n" <<"[3]quicksort\n" <<"[4]heapsort\n" <<"[5]insertion,withbinarysearch---project2P2\n" <<"[6]scansort---Project2P3\n" <<"[7]bubblesort---Project2P4\n" <<"[8]mergesort---Project7P4\n" < } voidintro()////介绍函数 { cout<<"Testingprogramforsortingmethodsforacontiguouslist." < help(); } voidmain() { intro(); intn; Randomdice;////随机数 Error_codereport; Keytarget;//目标键 charcommand=''; while(command! ='q'&&command! ='Q'){//大循环函数,不退出一直循环执行。 cout<<"EnteracommandofH,Q,F,O,D," <<"0,1,2,3,4,5,6,7,8,9,b: " < cin>>command; switch(command){ case'h': case'H': help(); break; case'd': case'D': cout<<"\nUnsortedlist\n"; the_list.traverse(write_entry); cout< break; case'o': case'O': cout<<"\nLastsortedlist\n"; copy_list.traverse(write_entry);//写出数组 cout< break; case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9': case'b': case'B': {//选择不同的排序函数 copy_list=the_list; Key: : comparisons=0; Key: : assignments=0; Timerclock; switch(command){ case'0': cout<<"InsertionSort"; copy_list.insertion_sort(); break; case'1': cout<<"SelectionSort"; copy_list.selection_sort(); break; case'2': cout<<"She
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 各种 排序 算法 课程设计 报告