news 2026/8/21 9:49:22

归并排序算法实现,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/8/20 14:49:13

攻防世界——BadProgrammer

拿到靶机首先抓包观察用的是什么服务器和框架发现服务器是Nginx&#xff0c;框架是PHP的express框架再用dirsearch扫一遍发现扫出了/static../意味着服务器存在配置错误&#xff0c;导致了目录遍历漏洞。当服务器配置不当时&#xff0c;特别是处理静态文件路径时&#xff0c;攻…

作者头像 李华
网站建设 2026/8/21 15:08:27

AI 搜索时代新战场:智汇GEO 如何重构品牌 AI 形象管理规则

AI 搜索已成为商业决策与消费选择的重要参考场景&#xff0c;品牌在 AI 生成结果中的能见度、信息准确性直接影响市场信任度与商业转化。当 AI 答案的话语权持续提升&#xff0c;品牌传统形象管理模式已难以应对动态变化的 AI 生态&#xff0c;而新榜智汇的出现&#xff0c;正为…

作者头像 李华
网站建设 2026/8/21 19:07:17

小红书Java面试被问:java创建对象有哪些方式?

在Java中&#xff0c;创建对象主要有以下五种核心方式&#xff0c;每种方式都有其适用场景&#xff1a; 1. 使用 new 关键字&#xff08;最常用&#xff09; java // 调用构造方法 Person person new Person(); 特点&#xff1a;直接调用类的构造器&#xff0c;触发类加载&a…

作者头像 李华
网站建设 2026/8/22 0:03:26

2025年AI品牌舆情监听:9款核心工具评估与选择指南

什么是大型语言模型监控工具&#xff1f; LLM监控工具追踪您的品牌在ChatGPT、Claude和谷歌AI概览等平台生成的AI响应中的表现。 当潜在客户向人工智能询问你所在行业的产品或服务时&#xff0c;你需要知道你的品牌是否被提及。以及你与竞争对手的比较。 这些监控LLM可见度的工…

作者头像 李华
网站建设 2026/8/21 19:06:00

B2B内容营销终极指南:基于数据的有效策略、无效陷阱与可忽略的噪音

什么是B2B内容营销&#xff1f; B2B内容营销是通过高质量内容量身定制&#xff0c;教育、影响并转化企业买家的方式。 这不是为了提高曝光率或通过社交媒体帖子追逐点击。这或许能吸引注意力&#xff0c;但很少能推动行动。 B2B买家不会草率做出决策。他们会让团队成员介入&…

作者头像 李华
网站建设 2026/8/21 4:32:04

程序员搞钱新赛道:大模型开发全栈教程,小白也能30天速成!

Part.1 AI工程师都要会些什么&#xff1f; 大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;技术的兴起&#xff0c;正在深刻影响软件的形态&#xff0c;开发者的工作也从实现业务逻辑、构建独立应用&#xff0c;转向以LLM为底层引擎快速搭建智能应用的…

作者头像 李华