




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
。各种排序算法总结排序算法是最基本最常用的算法,不同的排序算法在不同的场景或应用中会有不同的表现,我们需要对各种排序算法熟练才能将它们应用到实际当中,才能更好地发挥它们的优势。今天,来总结下各种排序算法。下面这个表格总结了各种排序算法的复杂度与稳定性:各种排序算法复杂度比较.png冒泡排序冒泡排序可谓是最经典的排序算法了,它是基于比较的排序算法,时间复杂度为O(n2),其优点是实现简单,n较小时性能较好。 算法原理相邻的数据进行两两比较,小数放在前面,大数放在后面,这样一趟下来,最小的数就被排在了第一位,第二趟也是如此,如此类推,直到所有的数据排序完成 c+代码实现1. voidbubble_sort(intarr,intlen)2. 3. for(inti=0;i=i;j-)6. 7. if(arrjarrj-1)8. 9. inttemp=arrj;10. arrj=arrj-1;11. arrj-1=temp;12. 13. 14. 15. 选择排序 算法原理先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 c+代码实现1. voidselect_sort(intarr,intlen)2. 3. for(inti=0;ilen;i+)4. 5. intindex=i;6. for(intj=i+1;jlen;j+)7. 8. if(arrjarrindex)9. index=j;10. 11. if(index!=i)12. 13. inttemp=arri;14. arri=arrindex;15. arrindex=temp;16. 17. 18. 插入排序 算法原理将数据分为两部分,有序部分与无序部分,一开始有序部分包含第1个元素,依次将无序的元素插入到有序部分,直到所有元素有序。插入排序又分为直接插入排序、二分插入排序、链表插入等,这里只讨论直接插入排序。它是稳定的排序算法,时间复杂度为O(n2) c+代码实现1. voidinsert_sort(intarr,intlen)2. 3. for(inti=1;i-1&karrj)8. 9. arrj+1=arrj;10. j-;11. 12. arrj+1=k;13. 14. 快速排序 算法原理快速排序是目前在实践中非常高效的一种排序算法,它不是稳定的排序算法,平均时间复杂度为O(nlogn),最差情况下复杂度为O(n2)。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 c+代码实现1. voidquick_sort(intarr,intleft,intright)2. 3. if(leftright)4. 5. inti=left,j=right,target=arrleft;6. while(ij)7. 8. while(itarget)9. j-;10. if(ij)11. arri+=arrj;12. 13. while(ij&arritarget)14. i+;15. if(ij)16. arrj=arri;17. 18. arri=target;19. quick_sort(arr,left,i-1);20. quick_sort(arr,i+1,right);21. 22. 归并排序 算法原理归并排序具体工作原理如下(假设序列共有n个元素):o 将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素 o 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素 o 重复步骤2,直到所有元素排序完毕归并排序是稳定的排序算法,其时间复杂度为O(nlogn),如果是使用链表的实现的话,空间复杂度可以达到O(1),但如果是使用数组来存储数据的话,在归并的过程中,需要临时空间来存储归并好的数据,所以空间复杂度为O(n) c+代码实现1. voidmerge(intarr,inttemp_arr,intstart_index,intmid_index,intend_index)2. 3. inti=start_index,j=mid_index+1;4. intk=0;5. while(imid_index+1&jarrj)8. temp_arrk+=arrj+;9. else10. temp_arrk+=arri+;11. 12. while(imid_index+1)13. 14. temp_arrk+=arri+;15. 16. while(jend_index+1)17. temp_arrk+=arrj+;18. 19. for(i=0,j=start_index;jend_index+1;i+,j+)20. arrj=temp_arri;21. 22. 23. voidmerge_sort(intarr,inttemp_arr,intstart_index,intend_index)24. 25. if(start_indexend_index)26. 27. intmid_index=(start_index+end_index)/2;28. merge_sort(arr,temp_arr,start_index,mid_index);29. merge_sort(arr,temp_arr,mid_index+1,end_index);30. merge(arr,temp_arr,start_index,mid_index,end_index);31. 32. 堆排序二叉堆二叉堆是完全二叉树或者近似完全二叉树,满足两个特性 父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值 每个结点的左子树和右子树都是一个二叉堆 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。一般二叉树简称为堆。堆的存储一般都是数组来存储堆,i结点的父结点下标就为(i 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。存储结构如图所示:堆结构.png堆排序原理堆排序的时间复杂度为O(nlogn) 算法原理(以最大堆为例)o 先将初始数据R1.n建成一个最大堆,此堆为初始的无序区 o 再将关键字最大的记录R1(即堆顶)和无序区的最后一个记录Rn交换,由此得到新的无序区R1.n-1和有序区Rn,且满足R1.n-1.keysRn.key o 由于交换后新的根R1可能违反堆性质,故应将当前无序区R1.n-1调整为堆。 o 重复2、3步骤,直到无序区只有一个元素为止。 c+代码实现1. /*2. *将数组arr构建大根堆3. *paramarr待调整的数组4. *parami待调整的数组元素的下标5. *paramlen数组的长度6. */7. voidheap_adjust(intarr,inti,intlen)8. 9. intchild;10. inttemp;11. 12. for(;2*i+1len;i=child)13. 14. child=2*i+1;/子结点的位置=2*父结点的位置+115. /得到子结点中键值较大的结点16. if(childarrchild)17. child+;18. /如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点19. if(arri=0;i-)38. 39. heap_adjust(arr,i,len);40. 41. 42. for(i=len-1;i0;i-)43. 44. /将第1个元素与当前最后一个元素交换,保证当前的最后一个位置的元素都是现在的这个序列中最大的45. inttemp=arr0;46. arr0=arri;47. arri=temp;48. /不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值49. heap_adjust(arr,0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年初级产品经理实战模拟题集及解析手册
- 2025年平面设计师技能认证考试模拟题集
- 2026届福建省建瓯市芝华中学化学高一上期中监测试题含解析
- 2025年保险公司招聘笔试备考资料及模拟题集答案
- 2025年高级工程师英语应用能力测试题库及答案解析
- 2025年物流工程师中级考试模拟题及备考建议
- 2025年财务经理面试必-备知识与预测题详解
- 2025年编程算法竞赛实战指南与模拟题解答
- 2025年监理《建设工程监理案例分析(交通)》考后答案
- 2025年财务会计主管招聘笔试指南及模拟题解析
- 吊装作业专项安全检查表
- 望舌-中医舌诊-课件
- 《华为团队工作法》读书笔记PPT模板思维导图下载
- 2022年上海市法院系统辅助文员招聘128人笔试备考题库及答案解析
- 全过程工程咨询服务技术方案
- GB/T 4802.1-2008纺织品织物起毛起球性能的测定第1部分:圆轨迹法
- GB/T 35568-2017中国荷斯坦牛体型鉴定技术规程
- GB/T 28707-2012碟簧支吊架
- GB/T 2791-1995胶粘剂T剥离强度试验方法挠性材料对挠性材料
- GB/T 25702-2010复摆颚式破碎机颚板磨耗
- 超分子化学简介课件
评论
0/150
提交评论