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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

排序算法实验报告.docx

1、排序算法实验报告数据构造实验报告八种排序算法实验报告一、实验内容编写关于八种排序算法的C语言程序,要求包含直接插入排序、希尔排序、简单项选择择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。二、实验步骤各种内部排序算法的比拟:1.八种排序算法的复杂度分析时间与空间。2.八种排序算法的C语言编程实现。3.八种排序算法的比拟,包括比拟次数、移动次数。三、稳定性,时间复杂度和空间复杂度分析比拟时间复杂度函数的情况:时间复杂度函数O(n)的增长情况所以对n较大的排序记录。一般的选择都是时间复杂度为O(nlog2n)的排序方法。时间复杂度来说:(1)平方阶(O(n2)排序 各类简单排序:直接插入、

2、直接选择和冒泡排序;(2)线性对数阶(O(nlog2n)排序快速排序、堆排序和归并排序;(3)O(n1+)排序,是介于0和1之间的常数。 希尔排序(4)线性阶(O(n)排序 基数排序,此外还有桶、箱排序。说明:当原表有序或根本有序时,直接插入排序和冒泡排序将大大减少比拟次数和移动记录的次数,时间复杂度可降至On;而快速排序那么相反,当原表根本有序时,将蜕化为冒泡排序,时间复杂度提高为On2;原表是否有序,对简单项选择择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。稳定性:排序算法的稳定性:假设待排序的序列中,存在多个具有一样关键字的记录,经过排序, 这些记录的相对次序保持不变,那么称该

3、算法是稳定的;假设经排序后,记录的相对 次序发生了改变,那么称该算法是不稳定的。稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位一样的元素其顺序再高位也一样时是不会改变的。另外,如果排序算法稳定,可以防止多余的比拟;稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序四、设计细节排序有内部排序和外部排序,内部排序是数据记录在内存中进展排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要

4、访问外存。我们这里说说八大排序就是内部排序。1.插入排序-直接插入排序Straight lnsertion Sort根本思想:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进展插入,直至整个序列有序为止。要点:设立哨兵,作为临时存储和判断数组边界之用。直接插入排序例如:如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。 时效分析:时间复杂度:On22.插入排序希尔排序Shells

5、 Sort希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改良。希尔排序又叫缩小增量排序根本思想:先将整个待排序的记录序列分割成为假设干子序列分别进展直接插入排序,待整个序列中的记录“根本有序时,再对全体记录进展依次直接插入排序。操作方法:1.选择一个增量序列t1,t2,tk,其中titj,tk=1;2.按增量序列个数k,对序列进展k 趟排序;3.每趟排序,根据对应的增量ti,将待排序列分割成假设干长度为m 的子序列,分别对各子表进展直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。希尔排序的例如:算法的实现:我们简单处理增量序列:

6、增量序列d = n/2 ,n/4, n/8 .1n为要排序数的个数即:先将要排序的一组记录按某个增量dn/2,n为要排序数的个数分成假设干组子序列,每组中记录的下标相差d.对每组中全部元素进展直接插入排序,然后再用一个较小的增量d/2对它进展分组,在每组中再进展直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。时效分析:希尔排序时效分析很难,关键码的比拟次数与记录移动次数依赖于增量因子序列d的选取,特定情况下可以准确估算出关键码的比拟次数和记录的移动次数。目前还没有人给出选取最好的增量因子序列的方法。增量因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:增量因子

7、中除1 外没有公因子,且最后一个增量因子必须为1。希尔排序方法是一个不稳定的排序方法。3.选择排序简单项选择择排序Simple Selection Sort根本思想:在要排序的一组数中,选出最小或者最大的一个数与第1个位置的数交换;然后在剩下的数当中再找最小或者最大的与第2个位置的数交换,依次类推,直到第n-1个元素倒数第二个数和第n个元素最后一个数比拟为止。简单项选择择排序的例如:操作方法:第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;第二趟,从第二个记录开场的n-1 个记录中再选出关键码最小的记录与第二个记录交换;以此类推.第i 趟,那么从第i 个记录开场的n-i+1 个记录

8、中选出关键码最小的记录与第i 个记录交换,直到整个序列按关键码有序。4.选择排序堆排序Heap Sort堆排序是一种树形选择排序,是对直接选择排序的有效改良。根本思想:堆的定义如下:具有n个元素的序列k1,k2,.,kn),当且仅当满足时称之为堆。由堆的定义可以看出,堆顶元素即第一个元素必为最小项小顶堆。假设以一维数组存储一个堆,那么堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点堆顶元素的值是最小(或最大)的。如:a大顶堆序列:96, 83,27,38,11,09) (b) 小顶堆序列:12,36,24,85,47,30,53,91初始时把要排序的n个数的序列看

9、作是一棵顺序存储的二叉树一维数组存储二叉树,调整它们的存储序,使之成为一个堆,将堆顶元素输出,得到n 个元素中最小(或最大)的元素,这时堆的根节点的数最小或者最大。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n 个元素中次小(或次大)的元素。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。称这个过程为堆排序。因此,实现堆排序需解决两个问题:1. 如何将n 个待排序的数建成堆;2. 输出堆顶元素后,怎样调整剩余n-1 个元素,使其成为一个新堆。首先讨论第二个问题:输出堆顶元素后,对剩余n-1元素重新建成堆的调整过程。调整小顶堆的方法:1设有m 个

10、元素的堆,输出堆顶元素后,剩下m-1 个元素。将堆底元素送入堆顶最后一个元素与堆顶进展交换,堆被破坏,其原因仅是根结点不满足堆的性质。2将根结点与左、右子树中较小元素的进展交换。3假设与左子树交换:如果左子树堆被破坏,即左子树的根结点不满足堆的性质,那么重复方法 2.4假设与右子树交换,如果右子树堆被破坏,即右子树的根结点不满足堆的性质。那么重复方法 2.5继续对不满足堆性质的子树进展上述交换操作,直到叶子结点,堆被建成。称这个自根结点到叶子结点的调整过程为筛选。如图:再讨论对n 个元素初始建堆的过程。建堆方法:对初始序列建堆的过程,就是一个反复进展筛选的过程。1n 个结点的完全二叉树,那么最

11、后一个结点是第个结点的子树。2筛选从第个结点为根的子树开场,该子树成为堆。3之后向前依次对各结点为根的子树进展筛选,使之成为堆,直到根结点。如图建堆初始过程:无序序列:49,38,65,97,76,13,27,49算法的实现:从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。时效分析:设树深度为k,。从根到叶的筛选,元素比拟次数至多2(k-1)次,交换记录至多k 次。所以,在建好堆后,排序过程中的筛选次数不超过下式:而建堆时的比拟次数不超过4n 次,因此堆排序最坏情况下,时间复杂

12、度也为:O(nlogn )。5.交换排序冒泡排序Bubble Sort 根本思想:在要排序的一组数中,对当前还未排好序的X围内的全部数,自上而下对相邻的两个数依次进展比拟和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比拟后发现它们的排序与排序要求相反时,就将它们互换。冒泡排序的例如:6.交换排序快速排序Quick Sort根本思想:1选择一个基准元素,通常选择第一个元素或者最后一个元素,2通过一趟排序讲待排序的记录分割成独立的两局部,其中一局部记录的元素值均比基准元素值小。另一局部记录的元素值比基准值大。3此时基准元素在其排好序后的正确位置4然后分别对这两局部记录用同样的方法继续进

13、展排序,直到整个序列有序。快速排序的例如:(a)一趟排序的过程:(b)排序的全过程:时效分析:快速排序是通常被认为在同数量级O(nlog2n)的排序方法中平均性能最好的。但假设初始序列按关键码有序或根本有序时,快排序反而蜕化为冒泡排序。为改良之,通常以“三者取中法来选取基准记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。7.归并排序Merge Sort根本思想: 归并Merge排序法是将两个或两个以上有序表合并成一个新的有序表,即把待排序序列分为假设干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序例如:算法的实

14、现:1 个元素的表总是有序的。所以对n 个元素的待排序列,每个元素可看成1 个有序子表。对子表两两合并生成n/2个子表,所得子表除最后一个子表长度可能为1 外,其余子表长度均为2。再进展两两合并,直到生成n 个元素按关键码有序的表。8.桶排序/基数排序(Radix Sort)根本思想:是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级一样的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。五、程序设计1、直接插入排序算法的实现2、希尔排序算法的实

15、现3、简单项选择择排序算法的实现4、堆排序算法的实现5、冒泡排序算法优化后的实现6、快速排序算法的实现7、归并排序算法的实现8、基数排序算法的实现六、测试结果1、直接插入排序算法的实现有如下结果:2、希尔排序算法的实现有如下结果:3、简单项选择择排序算法的实现4、堆排序算法的实现5、冒泡排序算法优化后的实现6、快速排序算法的实现7、归并排序算法的实现8、基数排序算法的实现七、总结反思本次对于八种排序的系统学习,利用图标的记忆能够很好的帮助学习。花了很长时间终于把排序的根底学了一下,这段时间学了很多东西,总结一下:学的排序算法有:插入排序,合并排序,冒泡排序,选择排序,希尔排序,堆排序,快速排序

16、,基数排序。比拟一下学习后的心得。我不是很清楚他们的时间复杂度,也真的不知道他们到底谁快谁慢,因为书上的推导我确实只是小小了解,并没有消化。也没有完全理解他们的精华,所以又什么错误的还需要高手指点。1.排序稳定,所谓排序稳定就是指:如果两个数一样,对他们进展的排序结果为他们的相对顺序不变。例如A=1,2,1,2,1这里排序之后是A = 1,1,1,2,2 稳定就是排序后第一个1就是排序前的第一个1,第二个1就是排序前第二个1,第三个1就是排序前的第三个1。同理2也是一样。这里用颜色标明了。不稳定呢就是他们的顺序不应和开场顺序一致。也就是可能会是A=1,1,1,2,2这样的结果。2.感觉谁最好,

17、在我的印象中快速排序是最好的,时间复杂度:n*log(n),不稳定排序。原地排序。他的名字很棒,快速嘛。当然快了。我觉得他的思想很不错,分治,而且还是原地排序,省去和很多的空间浪费。速度也是很快的,n*log(n)。但是有一个软肋就是如果已经是排好的情况下时间复杂度就是n*n,不过在参加随机的情况下这种情况也得以好转,而且他可以做任意的比拟,只要你能给出两个元素的大小关系就可以了。适用X围广,速度快。3.插入排序:n*n的时间复杂度,稳定排序,原地排序。插入排序是我学的第一个排序,速度还是很快的,特别是在数组已排好了之后,用它的思想来插入一个数据,效率是很高的。因为不用全部排。他的数据交换也很

18、少,只是数据后移,然后放入要插入的数据。这里不是指调用插入排序,而是用它的思想。我觉得,在数据大局部都排好了,用插入排序会给你带来很大的方便。数据的移动和交换都很少。4.冒泡排序,n*n的时间复杂度,稳定排序,原地排序。冒泡排序的思想很不错,一个一个比拟,把小的上移,依次确定当前最小元素。因为他简单,稳定排序,而且好实现,所以用处也是比拟多的。还有一点就是加上哨兵之后他可以提前退出。5.选择排序,n*n的时间复杂度, 稳定排序,原地排序。选择排序就是冒泡的根本思想,从小的定位,一个一个选择,直到选择完毕。他和插入排序是一个相反的过程,插入是确定一个元素的位置,而选择是确定这个位置的元素。他的好

19、处就是每次只选择确定的元素,不会对很多数据进展交换。所以在数据交换量上应该比冒泡小。6.插入排序,选择排序,冒泡排序的比拟,他们的时间复杂度都是n*n。我觉得他们的效率也是差不多的,我个人喜欢冒泡一些,因为要用它的时候数据多半不多,而且可以提前的返回已经排序好的数组。而其他两个排序就算已经排好了,他也要做全部的扫描。在数据的交换上,冒泡确实比他们都多。举例说明插入一个数据在末尾后排序,冒泡只要一次就能搞定,而选择和插入都必须要n*n的复杂度才能搞定。7.合并排序:n*log(n)的时间复杂度, 稳定排序,非原地排序。他的思想是分治,先分成小的局部,排好局部之后合并,因为我们另外申请的空间,在合

20、并的时候效率是0(n)的。速度很快。貌似他的上限是n*log(n),所以如果说是比拟的次数的话,他比快速排序要少一些。对任意的数组都能有效地在n*log(n)排好序。但是因为他是非原地排序,所以虽然他很快,但是貌似他的人气没有快速排序高。8.堆排序:n*log(n)的时间复杂度, 非稳定排序,原地排序。他的思想是利用的堆这种数据构造,堆可以看成一个完全二叉树,所以在排序中比拟的次数可以做到很少。加上他也是原地排序,不需要申请额外的空间,效率也不错。可是他的思想感觉比快速难掌握一些。还有就是在已经排好序的根底上添加一个数据再排序,他的交换次数和比拟次数一点都不会减少。虽然堆排序在使用的中没有快速

21、排序广泛,但是他的数据构造和思想真的很不错,而且用它来实现优先队列,效率没得说。堆,还是要好好学习掌握的。9.希尔排序:n*log(n)的时间复杂度(这里是错误的,应该是nlamda(1 lamda 2), lamda和每次步长选择有关。), 非稳定排序,原地排序。主要思想是分治,不过他的分治和合并排序的分治不一样,他是按步长来分组的,而不是想合并那样左一半右一半。开场步长为整个的长度的一半。分成nLen/2个组,然后每组排序。接个步长减为原来的一半在分组排序,直到步长为1,排序之后希尔排序就完成了。这个思路很好,据说是插入排序的升级版,所以在实现每组排序的时候我成心用了插入排序。我觉得他是一

22、个特别好的排序方法了。他的缺点就是两个数可能比拟屡次,因为两个数据会屡次分不过他们不会出现数据的交换。效率也是很高的。10.快速排序,堆排序,合并排序,希尔排序的比拟,他们的时间复杂的都是n*log(n),我认为在使用上快速排序最广泛,他原地排序,虽然不稳定,可是很多情况下排序根本就不在意他是否稳定。他的比拟次数是比拟小的,因为他把数据分成了大和小的两局部。每次都确定了一个数的位置,所以理论上说不会出现两个数比拟两次的情况,也是在最后在交换数据,说以数据交换上也很少。合并排序和堆排序也有这些优点,但是合并排序要申请额外的空间。堆排序堆已经排好的数据交换上比快速多。所以目前快速排序用的要广泛的多

23、。还有他很容易掌握和实现。11.基数排序:n的时间复杂度,稳定排序,非原地排序。他的思想是数据比拟集中在一个X围,例如都是4位数,都是5位数,或数据有多个关键字,我们先从各位开场排,然后排十位,依次排到最高位,因为我们可以用一个n的方法排一位,所以总的方法为d*n的复杂度。关键字也一样,我们先排第3个关键字,在排第3个关键字,最后排第一个关键字。只有能保证每个关键字在n的时间复杂度完成,那么整个排序就是一个d*n的时间复杂度。所以总的速度是很快的。不过有一点就是要确保关键字能在n的时间复杂度完成。12.排序算法的最后感悟:黑格尔说过:存在即合理。所以这些排序的算法都是很好的,他确实给了我们思想

24、上的帮助。感谢前人把精华留给了我们。我得到的收获很大,总结一下各自排序的收获:冒泡:好实现,速度不慢,使用于轻量级的数据排序。插入排序:也使用于小数据的排序,但是我从他的思想中学到怎么插入一个数据。呵呵,这样就知道在排好的数据里面,不用再排序了,而是直接调用一下插入就可以了。选择排序:我学会了怎么去获得最大值,最小值等方法。只要选择一下,不就可以了。合并排序:我学会分而治之的方法,而且在合并两个数组的时候很适用。堆排序:可以用它来实现优先队列,而且他的思想应该给我加了很多内力。快速排序:本来就用的最多的排序,对我的帮助大的都不知道怎么说好。希尔排序:也是分治,让我看到了分治的不同,原来还有这种思想的存在。基数排序:特殊情况特殊处理。

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

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