news 2026/9/2 3:59:24

归并排序算法实现,kotlin,c++,python

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
归并排序算法实现,kotlin,c++,python

好的,我们来详细、系统地解释归并算法(Merge Algorithm)及其核心逻辑。

  1. 基本概念

归并算法(Merge Algorithm)是将两个或两个以上已经有序的序列合并成一个新的有序序列的过程。它是归并排序(Merge Sort)算法的核心组成部分。

一个关键点:归并算法本身不负责排序,它负责合并。它假设输入的子序列已经是排好序的,然后高效地将它们合并。

  1. 核心逻辑(以合并两个有序数组为例)

我们用一个具体的例子来说明。假设有两个已排序的数组:

A = [3, 8, 15, 20] B = [1, 5, 10, 18, 25]

目标:合并成一个有序数组 C。

算法步骤(逻辑):

  1. 初始化指针:用三个指针(或索引):
    · i -> 指向数组A的当前元素(初始为0)
    · j -> 指向数组B的当前元素(初始为0)
    · k -> 指向结果数组C的当前位置(初始为0)
  2. 比较与选取:
    · 比较 A[i] 和 B[j]。
    · 将较小的元素复制到结果数组 C[k]。
    · 移动指针:被选中的数组指针(i 或 j)和 k 都向前移动一位。
  3. 处理剩余元素:
    · 当其中一个数组(比如A)的所有元素都被取完后,另一个数组(B)中可能还有剩余元素。
    · 由于B本身是有序的,直接将B中剩余的所有元素按顺序复制到C的末尾。
  4. 终止:当两个数组的所有元素都处理完毕时,合并完成。

图文逻辑推演(针对上面例子):

步骤 | 比较 A[i] 和 B[j] | 较小值 | C (结果数组) | i, j 变化 -----|------------------|--------|------------------------|----------- 初始 | | | [] | i=0, j=0 1 | A[0]=3 vs B[0]=1 | 1 | [1] | j=1 2 | 3 vs 5 | 3 | [1, 3] | i=1 3 | 8 vs 5 | 5 | [1, 3, 5] | j=2 4 | 8 vs 10 | 8 | [1, 3, 5, 8] | i=2 5 | 15 vs 10 | 10 | [1, 3, 5, 8, 10] | j=3 6 | 15 vs 18 | 15 | [1, 3, 5, 8, 10, 15] | i=3 7 | 20 vs 18 | 18 | [1, 3, 5, 8, 10, 15, 18] | j=4 8 | 20 vs 25 | 20 | [1, 3, 5, 8, 10, 15, 18, 20] | i=4 (A耗尽) 9 | A已空,复制B剩余 | 25 | [1,3,5,8,10,15,18,20,25] | 完成
  1. 伪代码
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
  1. 时间复杂度与空间复杂度

· 时间复杂度:O(n + m),其中n和m是两个输入序列的长度。因为每个元素只需比较和复制一次。
· 空间复杂度:O(n + m),需要额外的空间来存储合并后的结果(如果不在原数组上操作)。在归并排序中,这是导致其不是“原地排序”的主要原因。

  1. 归并排序中的角色

归并算法是归并排序的“合并”步骤。归并排序采用分治法:

  1. 分解:递归地将数组分成两半,直到每个子数组只有一个元素(单个元素自然有序)。

  2. 解决:递归地排序子数组(实际上分解到底层就自然有序了)。

  3. 合并:使用归并算法将两个已排序的子数组合并成一个大的有序数组。

  4. 关键特性与优势

  5. 稳定性:在比较时如果使用 <=,可以保持相等元素的原始相对顺序,因此是稳定的。

  6. 高效性:对于已排序的数据,合并操作非常高效,是外排序(如处理磁盘大文件)的基础。

  7. 可预测性:无论输入数据如何,时间复杂度都稳定为线性。

  8. 应用场景

· 归并排序:核心合并步骤。
· 外部排序:当数据量大到无法全部加载到内存时,将数据分成多个有序块,然后多路归并。
· 合并多个有序链表/数组:算法题的常见问题。
· 数据库操作:合并多个已排序的中间结果。

总结

归并算法的核心逻辑是:利用两个有序序列的特性,通过逐对比较首部元素,每次只取较小的一个,从而在线性时间内完成合并,生成一个新的有序序列。 它巧妙地将两个有序信息的合并效率提升到了O(n),是许多高效算法和系统设计的基石。
好嘞!咱们把merge函数也补上,让这个归并排序完整跑起来 ✅
我会保持原来逻辑不变,只用对应语言的自然写法来实现 —— 而且加点小注释,方便你一眼看懂。


✅ Kotlin 完整实现

funmergeSort(arr:IntArray){if(arr.size>1){valmid=arr.size/2valleft=arr.copyOfRange(0,mid)valright=arr.copyOfRange(mid,arr.size)mergeSort(left)mergeSort(right)merge(arr,left,right)}}funmerge(result:IntArray,left:IntArray,right:IntArray){vari=0// left 的索引varj=0// right 的索引vark=0// result 的索引while(i<left.size&&j<right.size){if(left[i]<=right[j]){result[k]=left[i]i++}else{result[k]=right[j]j++}k++}// 处理剩余元素while(i<left.size){result[k]=left[i]i++;k++}while(j<right.size){result[k]=right[j]j++;k++}}

✅ C++ 完整实现

#include<vector>usingnamespacestd;voidmergeSort(vector<int>&arr){if(arr.size()<=1)return;intmid=arr.size()/2;vector<int>left(arr.begin(),arr.begin()+mid);vector<int>right(arr.begin()+mid,arr.end());mergeSort(left);mergeSort(right);merge(arr,left,right);}voidmerge(vector<int>&arr,constvector<int>&left,constvector<int>&right){inti=0,j=0,k=0;while(i<left.size()&&j<right.size()){if(left[i]<=right[j]){arr[k++]=left[i++];}else{arr[k++]=right[j++];}}// 剩余部分拷贝while(i<left.size())arr[k++]=left[i++];while(j<right.size())arr[k++]=right[j++];}

✅ Python 完整实现

defmerge_sort(arr):iflen(arr)<=1:returnmid=len(arr)//2left=arr[:mid]right=arr[mid:]merge_sort(left)merge_sort(right)merge(arr,left,right)defmerge(arr,left,right):i=j=k=0whilei<len(left)andj<len(right):ifleft[i]<=right[j]:arr[k]=left[i]i+=1else:arr[k]=right[j]j+=1k+=1# 拷贝剩余项whilei<len(left):arr[k]=left[i]i+=1k+=1whilej<len(right):arr[k]=right[j]j+=1k+=1

🎯测试小例子(Python)

nums=[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) —— 因为每次拆分都新建了数组(更简洁但略耗内存)。
  • 如果你想改成原地排序减少内存开销,也可以继续优化,不过代码会复杂一些~要不要我给你来个“省内存加强版”?😉
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 11:18:56

高通完成收购Ventana 加速布局RISC-V生态

12 月 10 日&#xff0c;高通宣布正式完成对 Ventana Micro Systems 的收购。此次并购进一步强化了高通在 RISC-V 架构与高性能计算领域 的技术布局&#xff0c;也释放出其在 AI 时代重塑底层算力架构的重要信号。 Ventana Micro Systems 是专注于 高性能 RISC-V 处理器架构 的…

作者头像 李华
网站建设 2026/9/2 11:15:59

springboot书籍分享系统-计算机毕业设计源码63905

摘 要 随着互联网技术的发展&#xff0c;书籍分享平台成为知识传播的重要渠道之一。然而&#xff0c;如何确保用户数据的安全性&#xff0c;特别是防止SQL注入攻击&#xff0c;成为了系统设计中的关键问题。本论文旨在探讨构建一个安全的书籍分享系统的可能性。 书籍分享系统实…

作者头像 李华
网站建设 2026/9/2 16:55:21

回溯算法--分割回文串

给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ] 难点 本题的难点在于 怎么理解…

作者头像 李华
网站建设 2026/9/1 5:35:02

家长用vivo,孩子用iPhone,限制孩子手机使用时长要怎么做?

当家长们深刻地意识到&#xff0c;孩子过度沉迷于手机&#xff0c;可能会对他们的学习产生严重的干扰&#xff0c;导致注意力分散、学习效率低下&#xff1b;在生活方面&#xff0c;也可能使孩子逐渐脱离现实社交&#xff0c;变得孤僻内向&#xff0c;影响他们的人际交往能力。…

作者头像 李华
网站建设 2026/8/31 17:52:00

PostgreSql 常用聚合函数

基础准备 CREATE TEMP TABLE demo(id int, v int, t text); INSERT INTO demo VALUES(1, 10, a),(2, 20, b),(3, NULL, c);idvt110a220b3NULLc注意&#xff1a;版本基于 PG 15&#xff0c;全部自带&#xff0c;无需扩展 A. 基础统计 SELECT count(*) AS cnt, -- 3c…

作者头像 李华