在本文中,我们学习 Merge Sort 背后的逻辑,并用 JavaScript 实现。最后,在空间和时间复杂度方面将归并排序与其他算法进行比较。
归并排序背后的逻辑
归并排序使用分而治之的概念对给定的元素列表进行排序。它将问题分解为较小的子问题,直到它们变得足够简单以至可以直接解决为止。
以下是归并排序的步骤:
1、将给定的列表分为两半(如果列表中的元素数为奇数,则使其大致相等)。
2、以相同的方式继续划分子数组,直到只剩下单个元素数组。
3、从单个元素数组开始,合并子数组,以便对每个合并的子数组进行排序。
4、重复第 3 步单元,直到最后得到一个排好序的数组。
以数组 [4, 8, 7, 2, 11, 1, 3] 为例,让我们看一下归并排序是如何工作的:
用 JavaScript 实现归并排序
首先实现一个将两个已排序子数组合并为一个已排序数组的函数 merge() 。要注意着两个子数组是已经被排好序的,这一点非常重要, merge() 函数只用于其进行合并。【《JavaScript视频教程》】
可以通过遍历这两个子数组来实现:
function merge(left, right) { let arr = [] // 如果任何一个数组为空,就退出循环 while (left.length && right.length) { // 从左右子数组的最小元素中选择较小的元素 if (left[0] < right[0]) { arr.push(left.shift()) } else { arr.push(right.shift()) } } // 连接剩余的元素,防止没有把两个数组遍历完整 return [ ...arr, ...left, ...right ] }
在这个函数中,通过把两个排好序的子数组(left、right)合并来获得一个排好序的大数组。首先,创建一个空数组。之后在 left 和 right 两个子数组中最小元素中的较小的一个,并将其添加到空数组。我们只需要检查 left 和 right 子数组中的第一个元素,因为它们是已排好序的。
在这个过程中,从子数组中删除了被选择的元素(通过 shift() 函数实现)。继续这个过程,直到其中一个子数组变为空。最后把非空子数组的剩余元素(因为它们已经被排序)插入主数组的最后面。
现在有了合并两个已排序数组的代码,接下来为实现归并排序算法的最终代码。这意味着要继续分割数组,直到最终只包含一个元素的数组为止:
function mergeSort(array) { const half = array.length / 2 if(array.length < 2){ return array } const left = array.splice(0, half) return merge(mergeSort(left),mergeSort(array)) }
在代码中先确定中点,并用 splice() 函数将数组分为两个子数组。如果元素数量为奇数,则左侧的元素数量会少一个。不断的划分数组,直到剩下单个元素的数组(array.length < 2)。然后用之前实现的 merge() 函数合并子数组。
代码实现后用前面的用例测试一下:
array = [4, 8, 7, 2, 11, 1, 3]; console.log(mergeSort(array));
输出符合预期:
1,2,3,4,7,8,11归并排序的效率
归并排序的最差时间复杂度为 $O(n\\log n)$,与快速排序的最佳情时间复杂度相同。归并排序是目前最快的排序算法之一。
与快速排序不同,归并排序不是in-place排序算法,这意味着除了输入数组之外,它还会占用额外的空间。这是因为我们使用了辅助数组来存储子数组。归并排序的空间复杂度为 $O(n)$。
归并排序的另一个优点是非常适合多线程,因为每个被划分出的一半都可以单独排序。另一种常见的减少归并排序运行时间的方法是在到达相对较小的子数组时(大约 7 个元素)使用插入排序。这是因为插入排序在处理小型或几乎排好序的数组时表现非常好。
总结
在本文中,我们了解了Merge Sort算法背后的逻辑,并用 JavaScript 实现。它是基本排序算法之一,可以帮助我们更好的了解分治法策略。
编程视频课程!!
消息,BTC OG内幕巨鲸近期增持ZEC多单4000枚,约合203.42万美元,持仓规模达到2113.61万美元,均价...
2 共享记忆正在毁掉多智能体?DecentMem准确消息,链上分析师AI姨表示,剑桥大学与芝加哥大学团队开源了多智能体记忆框架DecentMem,采用...
3 印度2026财年加密税务申报季合规要求提高印度2026财年加密税务申报季对投资者提出更高的合规要求。文章称,印度虚拟数字资产盈利仍...
4 美国政府对Anthropic AI模型施加出口管制美国政府对Anthropic最先进AI模型Fable 5和Mythos 5施加出口管制的内幕被披露。报道称,Amazon CEO ...
5 Garrett Jin增持ZEC多头仓位至4.6013万枚,持消息,Garrett Jin增持ZEC多头仓位至4.6013万枚,价值约1930万美元,目前浮亏超过95万美元。同时,...
6 Claude Fable 5对加密和DEFI的影响消息,Anthropic发布的AI模型Claude Fable 5为用户提供更强的推理和编码能力,正值加密市场面临安...
7 BTC OG内幕巨鲸:增持ZEC多单10423.49枚消息,BTC OG内幕巨鲸近期增持ZEC多单10,423.49枚,约合300万美元,持仓规模达到15,620,787.47美元,...
8 KuCoin暂停USDD充币服务消息,KuCoin宣布因进行必要维护,已暂时关闭以太坊网络和Switchboard协议的USDD充币服务。该平...
9 OpenRouter推出subagent工具:支持大模型在生消息,OpenRouter推出服务器端代理工具`openrouter:subagent`并开启测试,支持大模型在生成内容时将...
10 伊朗多家银行出现技术故障,正开展修复伊朗部分银行服务13日出现技术故障,受影响银行包括伊朗国民银行、伊朗出口银行、伊朗商业...
成都来彰科技 蜀ICP备2025134723号-1
资讯来源互联网,如有版权问题请联系管理员删除。