娄底市网站建设制作,深圳天琥室内设计学校,用wordpress做广告收益,建立网站需要分几部进行好的#xff0c;我们来详细、系统地解释归并算法#xff08;Merge Algorithm#xff09;及其核心逻辑。
基本概念
归并算法#xff08;Merge Algorithm#xff09;是将两个或两个以上已经有序的序列合并成一个新的有序序列的过程。它是归并排序#xff08;Merge Sort我们来详细、系统地解释归并算法Merge Algorithm及其核心逻辑。基本概念归并算法Merge Algorithm是将两个或两个以上已经有序的序列合并成一个新的有序序列的过程。它是归并排序Merge Sort算法的核心组成部分。一个关键点归并算法本身不负责排序它负责合并。它假设输入的子序列已经是排好序的然后高效地将它们合并。核心逻辑以合并两个有序数组为例我们用一个具体的例子来说明。假设有两个已排序的数组A [3, 8, 15, 20] B [1, 5, 10, 18, 25]目标合并成一个有序数组 C。算法步骤逻辑初始化指针用三个指针或索引· i - 指向数组A的当前元素初始为0· j - 指向数组B的当前元素初始为0· k - 指向结果数组C的当前位置初始为0比较与选取· 比较 A[i] 和 B[j]。· 将较小的元素复制到结果数组 C[k]。· 移动指针被选中的数组指针i 或 j和 k 都向前移动一位。处理剩余元素· 当其中一个数组比如A的所有元素都被取完后另一个数组B中可能还有剩余元素。· 由于B本身是有序的直接将B中剩余的所有元素按顺序复制到C的末尾。终止当两个数组的所有元素都处理完毕时合并完成。图文逻辑推演针对上面例子步骤 | 比较 A[i] 和 B[j] | 较小值 | C (结果数组) | i, j 变化 -----|------------------|--------|------------------------|----------- 初始 | | | [] | i0, j0 1 | A[0]3 vs B[0]1 | 1 | [1] | j1 2 | 3 vs 5 | 3 | [1, 3] | i1 3 | 8 vs 5 | 5 | [1, 3, 5] | j2 4 | 8 vs 10 | 8 | [1, 3, 5, 8] | i2 5 | 15 vs 10 | 10 | [1, 3, 5, 8, 10] | j3 6 | 15 vs 18 | 15 | [1, 3, 5, 8, 10, 15] | i3 7 | 20 vs 18 | 18 | [1, 3, 5, 8, 10, 15, 18] | j4 8 | 20 vs 25 | 20 | [1, 3, 5, 8, 10, 15, 18, 20] | i4 (A耗尽) 9 | A已空复制B剩余 | 25 | [1,3,5,8,10,15,18,20,25] | 完成伪代码function merge(arr1, arr2): i 0, j 0 result [] while i length(arr1) and j length(arr2): if arr1[i] arr2[j]: result.append(arr1[i]) i i 1 else: result.append(arr2[j]) j j 1 // 将剩余部分追加到结果两个while只有一个会执行 while i length(arr1): result.append(arr1[i]) i i 1 while j length(arr2): result.append(arr2[j]) j j 1 return result时间复杂度与空间复杂度· 时间复杂度O(n m)其中n和m是两个输入序列的长度。因为每个元素只需比较和复制一次。· 空间复杂度O(n m)需要额外的空间来存储合并后的结果如果不在原数组上操作。在归并排序中这是导致其不是“原地排序”的主要原因。归并排序中的角色归并算法是归并排序的“合并”步骤。归并排序采用分治法分解递归地将数组分成两半直到每个子数组只有一个元素单个元素自然有序。解决递归地排序子数组实际上分解到底层就自然有序了。合并使用归并算法将两个已排序的子数组合并成一个大的有序数组。关键特性与优势稳定性在比较时如果使用 可以保持相等元素的原始相对顺序因此是稳定的。高效性对于已排序的数据合并操作非常高效是外排序如处理磁盘大文件的基础。可预测性无论输入数据如何时间复杂度都稳定为线性。应用场景· 归并排序核心合并步骤。· 外部排序当数据量大到无法全部加载到内存时将数据分成多个有序块然后多路归并。· 合并多个有序链表/数组算法题的常见问题。· 数据库操作合并多个已排序的中间结果。总结归并算法的核心逻辑是利用两个有序序列的特性通过逐对比较首部元素每次只取较小的一个从而在线性时间内完成合并生成一个新的有序序列。 它巧妙地将两个有序信息的合并效率提升到了O(n)是许多高效算法和系统设计的基石。好嘞咱们把merge函数也补上让这个归并排序完整跑起来 ✅我会保持原来逻辑不变只用对应语言的自然写法来实现 —— 而且加点小注释方便你一眼看懂。✅ Kotlin 完整实现funmergeSort(arr:IntArray){if(arr.size1){valmidarr.size/2valleftarr.copyOfRange(0,mid)valrightarr.copyOfRange(mid,arr.size)mergeSort(left)mergeSort(right)merge(arr,left,right)}}funmerge(result:IntArray,left:IntArray,right:IntArray){vari0// left 的索引varj0// right 的索引vark0// result 的索引while(ileft.sizejright.size){if(left[i]right[j]){result[k]left[i]i}else{result[k]right[j]j}k}// 处理剩余元素while(ileft.size){result[k]left[i]i;k}while(jright.size){result[k]right[j]j;k}}✅ C 完整实现#includevectorusingnamespacestd;voidmergeSort(vectorintarr){if(arr.size()1)return;intmidarr.size()/2;vectorintleft(arr.begin(),arr.begin()mid);vectorintright(arr.begin()mid,arr.end());mergeSort(left);mergeSort(right);merge(arr,left,right);}voidmerge(vectorintarr,constvectorintleft,constvectorintright){inti0,j0,k0;while(ileft.size()jright.size()){if(left[i]right[j]){arr[k]left[i];}else{arr[k]right[j];}}// 剩余部分拷贝while(ileft.size())arr[k]left[i];while(jright.size())arr[k]right[j];}✅ Python 完整实现defmerge_sort(arr):iflen(arr)1:returnmidlen(arr)//2leftarr[:mid]rightarr[mid:]merge_sort(left)merge_sort(right)merge(arr,left,right)defmerge(arr,left,right):ijk0whileilen(left)andjlen(right):ifleft[i]right[j]:arr[k]left[i]i1else:arr[k]right[j]j1k1# 拷贝剩余项whileilen(left):arr[k]left[i]i1k1whilejlen(right):arr[k]right[j]j1k1测试小例子Pythonnums[38,27,43,3,9,82,10]merge_sort(nums)print(nums)# 输出[3, 9, 10, 27, 38, 43, 82]小贴士这三个版本都遵循了“分治 合并”的原始逻辑没有引入额外优化。时间复杂度O(n log n)空间复杂度O(n) —— 因为每次拆分都新建了数组更简洁但略耗内存。如果你想改成原地排序减少内存开销也可以继续优化不过代码会复杂一些要不要我给你来个“省内存加强版”