[算法]-归并排序
核心原理:归并排序是对分治思想的一种应用,通过将一个序列划分成2个有序的子序列,然后合并起来既是排序的结果。那要如何获得有序的子序列了?递归调用自身,将子序列一直拆分成元素只有1个的程度再向上回归,即可得到有序的子序列;
特点:时间复杂度O(nlongn),空间复杂度 O(n),稳定
下面贴一下分治法的解题步骤:
a.分解原问题为若干个子问题,这些子问题是原问题的规模较小的实例;
b. 解决这些子问题,递归地求解各子问题的规模足够小,则直接求解;
c. 合并这些子问题的解 成 原问题的解。
归并排序,c语言:
1 #include <stdio.h> 2 // time.h是用来统计执行时间的,可以去掉; 3 #include <time.h> 4 5 void merge(int arry[],int start,int half,int size){ 6 int left[half]; 7 int right[size-half]; 8 9 for(int l=0;l<half;l++){ 10 left[l]=arry[l]; 11 } 12 13 for(int r=0;r<size-half;r++){ 14 right[r]=arry[half+r]; 15 } 16 17 int t=half; 18 for(int i=0;i<size ;i++){ 19 if(start<half && t<size ){ 20 if(left[start] < right[t-half]){ 21 arry[i]=left[start]; 22 start++; 23 } else{ 24 arry[i]=right[t-half]; 25 t++; 26 } 27 28 // 左边序列遍历完 29 } else if( start >= half && t<size ){ 30 arry[i]=right[t-half]; 31 t++; 32 33 // 右边序列遍历完 34 } else if(start < half && t >= size){ 35 arry[i]=left[start]; 36 start++; 37 } 38 } 39 } 40 41 // 归并排序 42 void merge_sort(int arry[],int size){ 43 if(!arry || size < 2){ 44 return; 45 } 46 // j是左边子序列的index,k是右边子序列的index 47 int k=size/2; 48 merge_sort(arry,k); 49 merge_sort(&arry[k],size-k); 50 merge(arry,0,k,size); 51 52 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!