电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

19页
  • 卖家[上传人]:ni****g
  • 文档编号:455109479
  • 上传时间:2023-04-14
  • 文档格式:DOC
  • 文档大小:408.50KB
  • / 19 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、多种排序算法的分析与比较一、设计思想插入排序:首先,我们定义我们需要排序的数组,得到数组的长度。如果数组只有一个数字,那么我们直接认为它已经是排好序的,就不需要再进行调整,直接就得到了我们的结果。否则,我们从数组中的第二个元素开始遍历。然后,启动主索引,我们用curr当做我们遍历的主索引,每次主索引的开始,我们都使得要插入的位置(insertlndex)等于-1,即我们认为主索引之前的元素没有比主索引指向的元素值大的元素,那么自然主索引位置的元素不需要挪动位置。 然后,开始副索引,畐嗦引遍历所有主索引之前的排好的元素,当发现 主索引之前的某个元素比主索引指向的元素的值大时,我们就将要插入的位置 (in sertl ndex)记为第一个比主索引指向元素的位置,跳出副索弓I;否则,等待副索引自然完成。副索引遍历结束后,我们判断当前要插入的位置(insertlndex )是否等于-1,如果等于-1,说明主索引之前元素的值没有一个比主索引指向的元素的值大,那么主索引位置的元素不要挪动位 置,回到主索引,主索引向后走一位,进行下一次主索引的遍历;否则,说明主索引之前 insertlndex位置元

      2、素的值比主索引指向的元素的值大,那么,我们记录当前主索引指向的元 素的值,然后将主索引之前从insertlndex位置开始的所有元素依次向后挪一位,这里注意,要从后向前一位一位挪,否则,会使得数组成为一串相同的数字。最后,将记录下的当前索引指向的元素的值放在要插入的位置(in sertl ndex )处,进行下一次主索引的遍历。继续上面的工作,最终我们就可以得到我们的排序结果。插入排序的特点在于,我们每次遍历,主索引之前的元素都是已经排好序的,我们找到比主索引指向元素的值大的第一个元素的位 置,然后将主索引指向位置的元素插入到该位置,将该位置之后一直到主索引位置的元素依次向后挪动。这样的方法,使得挪动的次数相对较多,如果对于排序数据量较大,挪动成本较高的情况时,这种排序算法显然成本较高,时间复杂度相对较差,是初等通用排序算法中的一种。选择排序:选择排序相对插入排序,是插入排序的一个优化,优化的前提是我们认为数据是比较大的,挪动数据的代价比数据比较的代价大很多,所以我们选择排序是追求少挪动,以比较次数换取挪动次数。首先,我们定义我们需要排序的数组,得到数组的长度,定义一个结果数组,用来存

      3、放排好序的数组,定义一个最小值,定义一个最小值的位置。然后,进 入我们的遍历,每次进入遍历的时候我们都使得当前的最小值为9999,即认为每次最小值都是最大的数,用来进行和其他元素比较得到最小值,每次认为最小值的位置都是0,用来重新记录最小值的位置。然后,进入第二层循环,进行数值的比较,如果数组中的某个元素的值比最小值小,那么将当前的最小值设为元素的值,然后记录下来元素的位置,这样,当跳出循环体的时候,我们会得到要排序数组中的最小值,然后将最小值位置的数值设置为 9999,即我们得到了最小值之后,就让数组中的这个数成为最大值,然后将结果数组result第主索引值位置上的元素赋值为最小值,进行下一次外层循环重复上面的工作。最终我们就得到了排好序的结果数组result。选择排序的优势在于,我们挪动元素的次数很少,只是每次对要排序的数组进行整体遍历,找到其中的最小的元素,然后将改元素的值放到一个新的结果数组中去,这样大大减少了挪动的次序,即我们要排序的数组有多少元素,我们就挪动多少次,而因为每次都要对数组的所有元素进行遍历,那么比较的次数就比较多,达到了n2次,所以,我们使用选择排序的前提是,

      4、认为挪动元素要比比较元素的成本高出很多的时候。他相对与插入排序,他的比较次数大于插入排序的次数,而挪动次数就很少, 元素有多少个,挪动次数就是多少个。希尔排序:首先,我们定义一个要排序的数组,然后定义一个步长的数组,该步长数组是由一组特定的数字组成的,步长数组具体得到过程我们不去考虑,是由科学家经过很长时间计算得到的,已经根据时间复杂度的要求,得到了最适合希尔排序的一组步长值以及计算步长值的公式,我们这里直接拿来使用。然后根据要排序的数组的长度,选择比长度小的最大的步长值,作为我们开始的步长。然后,进入循环遍历,外层循环由步长值决定,直到步 长为1时,我们就可以精确比较每一个数值,所以外层循环最终当步长为1时,我们就将得到排序后的结果。然后,进入内层循环,内层循环从步长那个位置开始遍历,先记录下步长值位置的数值,启动副索引j,然后比较步长值位置的元素的值与减去步长值位置元素的值, 如果减去步长值处元素的值大于步长值位置的元素的值,那么,我们将减去步长值处的元素挪到步长值位置处,将副索引指向前一个步长值处然后再判断前一步长值与再前一步长值之 间的大小关系,重复上面的工作;如果前一步长值处

      5、元素的数值不比步长值处元素的数值大, 那么将刚才记录下的数值,放在目前j索引位置处。重复上面的步骤,直到遍历到我们的最后一个元素,然后将步长值减小到下一级步长。最终,当我们的步长值为1的遍历全部结束后,我们就得到了最终排序好的数组。希尔排序算法是初等排序算法向高等排序算法过度的 一个中间排序算法,他的时间复杂度相比初等排序有很大的提升,达到了0(nh.3)。而且希尔排序的稳定性也很好,如果给一个排好序的数组,希尔排序将会只进行数据的比较,不需要进行挪动,直接将结果返回,所以希尔排序在我们实际的应用当中还是比较值得推荐的。 而且,科学家也已经为我们计算出了非常合适的步长值以及计算步长值的公式,我们直接可以使用,使得我们的算法开发也非常容易。归并排序:首先,我们定义一个要排序的数组,得到数组的头下标top,得到数组的末尾下标bottom。然后,通过top和bottom得到数组的中间元素的下标middle,将数组人为的分成两半,即前半部分和后半部分。然后,递归调用算法,重复上面的过程,直到 top=bottom,即分到前半部分和后半部分只剩下一个元素的时候,调用Merge函数,进行真正意义上

      6、的排序算法。然后,进入Merge函数:首先定义一个tempa的数组,用来临时存放 要排序的数组,然后进入一个循环,当左面索引的值小于等于中间索引值,即当前半部分的数字还没有遍历完成, 且当右面索引的值小于等于末尾索引值,即当后半部分也有数字没有遍历完成时,进行遍历,遍历时,判断左面索引处的数字的值的大小是否小于或等于右面索 引位置数字的值,如果小于,那么,将左面索引位置的元素放进tempa数组中,将左索引加1继续判断是否进行再次遍历;否则,将右面索引位置的元素放进tempa数组中,将右索引加1继续判断是否进行再次遍历。直到这个循环结束。这时,我们将两个元素中, 小的元素放在了 tempa数组中,但是这时我们的左索引或是右索引可能还没有到达中间处或是末尾 处,即还没有遍历完成所有的这两个元素,但是有一面(或是前半部分或是后半部分)已经遍历完成。那么我们需要判断这时的左索引是否小于或等于了中间值,如果是,那么将begin赋值为做索引,end赋值为中间值;否则,将 begin赋值为右索引,将 end赋值为末尾值。 然后将所有begin和end之间的数字追加到tempa中,这时,tempa中的

      7、所有元素都排序成 功。最后,将tempa中的所有元素重新放回 array数组中的相应位置。这次Merge排序就结束了,然后返回递归的调用处,进行下次的递归调用和Merge函数。重复上面所有的工作,最终我们可以得到排序成功的array数组。归并排序相比与初等排序,其优势在于,我们使用了分而治之(Divide-and-Conquer )的思想,将复杂的问题细化,先小方面进行排序,然 后将排好序的元素合并在一起,再进行大方面的排序,这样就使我们的整体算法挪动次数变小,使整体的时间复杂度降低,优化了排序的次数。比起低等排序,如果要排序的数据量很大的时候,会明显体现出归并排序的优势。快速排序:相比于归并排序,快速排序是归并排序的一个优化。它可以有效减少挪动的次数,因为它每次递归调用的时候,都是将第一个数字当做pivot,然后根据这个pivot,将数组分成比pivot大和比pivot小的两个部分,然后进入排序阶段,最后递归调用快速排序 的算法,最终便得到了我们的排序结果。排序算法阶段:首先判断这次递归传进来的top值和bottom值,如果top值比bottom值大,或是相等,那么说明我们的递归已经

      8、到了最底层,已经将前、后两个部分的元素分成了只剩下各一个元素,则我们将退出本次递归调用,返回到上次调用的地方向下执行;否则,进入排序阶段。首先,开启主索引i=top+1开始,到bottom结束,如果我们的第i个元素比pivot大,那么就将其追加放入big数组中,否则,将其追加放入small数组中。循环结束后,我们开始将分好的两个数组分别返回到要排序的数组 array的相应位置处,进行拼接。这里注意:在拼接的过程中,不要忘记为pivot预留中间一个位置,然后将 pivot的值放到array中间的位置处。然后递归调用下次的快速排序函数。 而再一次的调用会将上次调用函数的时候,得到的比pivot小的部分进行排序,同样使得第一个元素成为新的 pivot,再次将数组分成大、小两个部分。继续上面同样的工作,我们最 终会分成每个部分只有一个元素,这时再次调用排序后,就得到了排序完成的两个元素,然后经过不断的返回到递归调用,将会不断的使小半部分的数组慢慢排序成功,然后进行第二部分的排序。同理,当最终所有的递归调用都结束之后,我们会得到最终排序的结果。快速排序算法的优势在于,他同样也是分而治之(Divi

      9、de-and-Conquer )的思想,巧妙之处在于,他每次分的时候已经实际意义上的将数组大小两个部分分好了,在递归回归的时候,相对拼接数组就十分简单。而归并排序在拼接数组的时候还需要将两部分数组进行比较,进行排序,这样使得我们挪动的次数就少了很多。但是,它也有不好用的时候,如果给你一个已经排好序的数组,那么它每次递归调用的时候,分开的两部分中,比pivot小的部分元素的个数为0,而比pivot大的部分元素的个数为当次调用递归传进来的数组长度减1的长度。所以需要的时间复杂度反而会增加。所以快速排序用在一个很随即的数组中时,一般会发挥比较好的性能。算法流程图-# -1 下面给出插入排序的算法流程图:说明:图1是插入排序算法的流程图,体现了插入排序的整体算法核心思想。其中,我们通过判断insertIndex的值,来决定我们主索引遍历位置的元素是否需要向前面插入,并且插入的到要插入的位置。遍历整个数组=i将最引min赋值矢夕9夕9,即毎次遍历开始时都无最小值+启动副索引,遍历整个数组:j 假一将当刖最小值赋值次副索引位置兀 素的值,并记录出现最小值的位置亘到副循坏结束得到数组中的最小值和位置,将最小值位置元素赋值为貽卿,将最小值加到结果数组中图2选择排序算法流程图说明:图2是选择排序算法的流程图,体现了选择排序的整体算法核心思想。其中,每次副循环我们都可以得到当前数组中的最小的元素的数值和位置,然后将每次得到最小的元素值追加到结果数组中,然后将最小元素的值赋值为最大值。得到比数组长度小的.最大的歩扶值

      《几种排序算法的分析与比较--C语言》由会员ni****g分享,可在线阅读,更多相关《几种排序算法的分析与比较--C语言》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.