电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOC文档下载
分享到微信 分享到微博 分享到QQ空间

几种排序算法的分析与比较--C语言

  • 资源ID:455109479       资源大小:408.50KB        全文页数:19页
  • 资源格式: DOC        下载积分:15金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要15金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

几种排序算法的分析与比较--C语言

多种排序算法的分析与比较一、设计思想插入排序:首先,我们定义我们需要排序的数组,得到数组的长度。如果数组只有一个数字,那么我们直接认为它已经是排好序的,就不需要再进行调整,直接就得到了我们的结果。否则,我们从数组中的第二个元素开始遍历。然后,启动主索引,我们用curr当做我们遍历的主索引,每次主索引的开始,我们都使得要插入的位置(insertlndex)等于-1,即我们认为主索引之前的元素没有比主索引指向的元素值大的元素,那么自然主索引位置的元素不需要挪动位置。 然后,开始副索引,畐嗦引遍历所有主索引之前的排好的元素,当发现 主索引之前的某个元素比主索引指向的元素的值大时,我们就将要插入的位置 (in sertl ndex)记为第一个比主索引指向元素的位置,跳出副索弓I;否则,等待副索引自然完成。副索引遍历结束后,我们判断当前要插入的位置(insertlndex )是否等于-1,如果等于-1,说明主索引之前元素的值没有一个比主索引指向的元素的值大,那么主索引位置的元素不要挪动位 置,回到主索引,主索引向后走一位,进行下一次主索引的遍历;否则,说明主索引之前 insertlndex位置元素的值比主索引指向的元素的值大,那么,我们记录当前主索引指向的元 素的值,然后将主索引之前从insertlndex位置开始的所有元素依次向后挪一位,这里注意,要从后向前一位一位挪,否则,会使得数组成为一串相同的数字。最后,将记录下的当前索引指向的元素的值放在要插入的位置(in sertl ndex )处,进行下一次主索引的遍历。继续上面的工作,最终我们就可以得到我们的排序结果。插入排序的特点在于,我们每次遍历,主索引之前的元素都是已经排好序的,我们找到比主索引指向元素的值大的第一个元素的位 置,然后将主索引指向位置的元素插入到该位置,将该位置之后一直到主索引位置的元素依次向后挪动。这样的方法,使得挪动的次数相对较多,如果对于排序数据量较大,挪动成本较高的情况时,这种排序算法显然成本较高,时间复杂度相对较差,是初等通用排序算法中的一种。选择排序:选择排序相对插入排序,是插入排序的一个优化,优化的前提是我们认为数据是比较大的,挪动数据的代价比数据比较的代价大很多,所以我们选择排序是追求少挪动,以比较次数换取挪动次数。首先,我们定义我们需要排序的数组,得到数组的长度,定义一个结果数组,用来存放排好序的数组,定义一个最小值,定义一个最小值的位置。然后,进 入我们的遍历,每次进入遍历的时候我们都使得当前的最小值为9999,即认为每次最小值都是最大的数,用来进行和其他元素比较得到最小值,每次认为最小值的位置都是0,用来重新记录最小值的位置。然后,进入第二层循环,进行数值的比较,如果数组中的某个元素的值比最小值小,那么将当前的最小值设为元素的值,然后记录下来元素的位置,这样,当跳出循环体的时候,我们会得到要排序数组中的最小值,然后将最小值位置的数值设置为 9999,即我们得到了最小值之后,就让数组中的这个数成为最大值,然后将结果数组result第主索引值位置上的元素赋值为最小值,进行下一次外层循环重复上面的工作。最终我们就得到了排好序的结果数组result。选择排序的优势在于,我们挪动元素的次数很少,只是每次对要排序的数组进行整体遍历,找到其中的最小的元素,然后将改元素的值放到一个新的结果数组中去,这样大大减少了挪动的次序,即我们要排序的数组有多少元素,我们就挪动多少次,而因为每次都要对数组的所有元素进行遍历,那么比较的次数就比较多,达到了n2次,所以,我们使用选择排序的前提是,认为挪动元素要比比较元素的成本高出很多的时候。他相对与插入排序,他的比较次数大于插入排序的次数,而挪动次数就很少, 元素有多少个,挪动次数就是多少个。希尔排序:首先,我们定义一个要排序的数组,然后定义一个步长的数组,该步长数组是由一组特定的数字组成的,步长数组具体得到过程我们不去考虑,是由科学家经过很长时间计算得到的,已经根据时间复杂度的要求,得到了最适合希尔排序的一组步长值以及计算步长值的公式,我们这里直接拿来使用。然后根据要排序的数组的长度,选择比长度小的最大的步长值,作为我们开始的步长。然后,进入循环遍历,外层循环由步长值决定,直到步 长为1时,我们就可以精确比较每一个数值,所以外层循环最终当步长为1时,我们就将得到排序后的结果。然后,进入内层循环,内层循环从步长那个位置开始遍历,先记录下步长值位置的数值,启动副索引j,然后比较步长值位置的元素的值与减去步长值位置元素的值, 如果减去步长值处元素的值大于步长值位置的元素的值,那么,我们将减去步长值处的元素挪到步长值位置处,将副索引指向前一个步长值处然后再判断前一步长值与再前一步长值之 间的大小关系,重复上面的工作;如果前一步长值处元素的数值不比步长值处元素的数值大, 那么将刚才记录下的数值,放在目前j索引位置处。重复上面的步骤,直到遍历到我们的最后一个元素,然后将步长值减小到下一级步长。最终,当我们的步长值为1的遍历全部结束后,我们就得到了最终排序好的数组。希尔排序算法是初等排序算法向高等排序算法过度的 一个中间排序算法,他的时间复杂度相比初等排序有很大的提升,达到了0(nh.3)。而且希尔排序的稳定性也很好,如果给一个排好序的数组,希尔排序将会只进行数据的比较,不需要进行挪动,直接将结果返回,所以希尔排序在我们实际的应用当中还是比较值得推荐的。 而且,科学家也已经为我们计算出了非常合适的步长值以及计算步长值的公式,我们直接可以使用,使得我们的算法开发也非常容易。归并排序:首先,我们定义一个要排序的数组,得到数组的头下标top,得到数组的末尾下标bottom。然后,通过top和bottom得到数组的中间元素的下标middle,将数组人为的分成两半,即前半部分和后半部分。然后,递归调用算法,重复上面的过程,直到 top=bottom,即分到前半部分和后半部分只剩下一个元素的时候,调用Merge函数,进行真正意义上的排序算法。然后,进入Merge函数:首先定义一个tempa的数组,用来临时存放 要排序的数组,然后进入一个循环,当左面索引的值小于等于中间索引值,即当前半部分的数字还没有遍历完成, 且当右面索引的值小于等于末尾索引值,即当后半部分也有数字没有遍历完成时,进行遍历,遍历时,判断左面索引处的数字的值的大小是否小于或等于右面索 引位置数字的值,如果小于,那么,将左面索引位置的元素放进tempa数组中,将左索引加1继续判断是否进行再次遍历;否则,将右面索引位置的元素放进tempa数组中,将右索引加1继续判断是否进行再次遍历。直到这个循环结束。这时,我们将两个元素中, 小的元素放在了 tempa数组中,但是这时我们的左索引或是右索引可能还没有到达中间处或是末尾 处,即还没有遍历完成所有的这两个元素,但是有一面(或是前半部分或是后半部分)已经遍历完成。那么我们需要判断这时的左索引是否小于或等于了中间值,如果是,那么将begin赋值为做索引,end赋值为中间值;否则,将 begin赋值为右索引,将 end赋值为末尾值。 然后将所有begin和end之间的数字追加到tempa中,这时,tempa中的所有元素都排序成 功。最后,将tempa中的所有元素重新放回 array数组中的相应位置。这次Merge排序就结束了,然后返回递归的调用处,进行下次的递归调用和Merge函数。重复上面所有的工作,最终我们可以得到排序成功的array数组。归并排序相比与初等排序,其优势在于,我们使用了分而治之(Divide-and-Conquer )的思想,将复杂的问题细化,先小方面进行排序,然 后将排好序的元素合并在一起,再进行大方面的排序,这样就使我们的整体算法挪动次数变小,使整体的时间复杂度降低,优化了排序的次数。比起低等排序,如果要排序的数据量很大的时候,会明显体现出归并排序的优势。快速排序:相比于归并排序,快速排序是归并排序的一个优化。它可以有效减少挪动的次数,因为它每次递归调用的时候,都是将第一个数字当做pivot,然后根据这个pivot,将数组分成比pivot大和比pivot小的两个部分,然后进入排序阶段,最后递归调用快速排序 的算法,最终便得到了我们的排序结果。排序算法阶段:首先判断这次递归传进来的top值和bottom值,如果top值比bottom值大,或是相等,那么说明我们的递归已经到了最底层,已经将前、后两个部分的元素分成了只剩下各一个元素,则我们将退出本次递归调用,返回到上次调用的地方向下执行;否则,进入排序阶段。首先,开启主索引i=top+1开始,到bottom结束,如果我们的第i个元素比pivot大,那么就将其追加放入big数组中,否则,将其追加放入small数组中。循环结束后,我们开始将分好的两个数组分别返回到要排序的数组 array的相应位置处,进行拼接。这里注意:在拼接的过程中,不要忘记为pivot预留中间一个位置,然后将 pivot的值放到array中间的位置处。然后递归调用下次的快速排序函数。 而再一次的调用会将上次调用函数的时候,得到的比pivot小的部分进行排序,同样使得第一个元素成为新的 pivot,再次将数组分成大、小两个部分。继续上面同样的工作,我们最 终会分成每个部分只有一个元素,这时再次调用排序后,就得到了排序完成的两个元素,然后经过不断的返回到递归调用,将会不断的使小半部分的数组慢慢排序成功,然后进行第二部分的排序。同理,当最终所有的递归调用都结束之后,我们会得到最终排序的结果。快速排序算法的优势在于,他同样也是分而治之(Divide-and-Conquer )的思想,巧妙之处在于,他每次分的时候已经实际意义上的将数组大小两个部分分好了,在递归回归的时候,相对拼接数组就十分简单。而归并排序在拼接数组的时候还需要将两部分数组进行比较,进行排序,这样使得我们挪动的次数就少了很多。但是,它也有不好用的时候,如果给你一个已经排好序的数组,那么它每次递归调用的时候,分开的两部分中,比pivot小的部分元素的个数为0,而比pivot大的部分元素的个数为当次调用递归传进来的数组长度减1的长度。所以需要的时间复杂度反而会增加。所以快速排序用在一个很随即的数组中时,一般会发挥比较好的性能。算法流程图-# -1 下面给出插入排序的算法流程图:说明:图1是插入排序算法的流程图,体现了插入排序的整体算法核心思想。其中,我们通过判断insertIndex的值,来决定我们主索引遍历位置的元素是否需要向前面插入,并且插入的到要插入的位置。遍历整个数组=i将最引min赋值矢夕9夕9,即毎次遍历开始时都无最小值+启动副索引,遍历整个数组:j 假"一将当刖最小值赋值次副索引位置兀 素的值,并记录出现最小值的位置亘到副循坏结束得到数组中的最小值和位置,将最小值位置元素赋值为貽卿,将最小值加到结果数组中图2选择排序算法流程图说明:图2是选择排序算法的流程图,体现了选择排序的整体算法核心思想。其中,每次副循环我们都可以得到当前数组中的最小的元素的数值和位置,然后将每次得到最小的元素值追加到结果数组中,然后将最小元素的值赋值为最大值。得到比数组长度小的.最大的歩扶值

注意事项

本文(几种排序算法的分析与比较--C语言)为本站会员(ni****g)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.