首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

递归归并排序的函数实现?

递归归并排序是一种高效的排序算法,它采用分治的思想将一个大的问题分解为多个小问题来解决。下面是递归归并排序的函数实现:

代码语言:txt
复制
def merge_sort(arr):
    if len(arr) <= 1:
        return arr

    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])

    return merge(left, right)

def merge(left, right):
    result = []
    i, j = 0, 0

    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    result.extend(left[i:])
    result.extend(right[j:])

    return result

递归归并排序的实现步骤如下:

  1. 首先判断待排序数组的长度,如果长度小于等于1,则直接返回该数组。
  2. 计算待排序数组的中间位置,将数组分为两部分,分别进行递归归并排序。
  3. 定义一个合并函数,用于将两个已排序的子数组合并为一个有序数组。
  4. 在合并函数中,使用两个指针分别指向左右两个子数组的起始位置,比较两个指针所指元素的大小,将较小的元素添加到结果数组中,并将相应指针向后移动。
  5. 当其中一个子数组的元素全部添加到结果数组中后,将另一个子数组的剩余元素依次添加到结果数组的末尾。
  6. 返回最终排序后的结果数组。

递归归并排序的优点是稳定性和时间复杂度。它可以保持相等元素的相对位置不变,并且具有稳定的时间复杂度O(nlogn),适用于大规模数据的排序。递归归并排序的应用场景包括但不限于需要稳定排序和对大规模数据进行排序的场景。

在腾讯云的产品中,可以使用云函数(SCF)来部署和执行递归归并排序的函数。云函数是一种无服务器计算服务,可以让开发人员以函数的形式编写代码,并实现自动弹性扩缩容,无需关心服务器和基础设施。你可以在腾讯云的云函数产品页(https://cloud.tencent.com/product/scf)了解更多关于云函数的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

归并排序递归实现

本文主要介绍2路归并排序递归实现。 2路归并排序简单介绍 下面是归并排序流程图。 ?...可以看到,每次程序都将数字两两分组(n/2个组),组内单独排序,最后将这些组两两合并,生成n/4个组,组内再单独排序。直到最后只剩下一个组为止。 2路归并排序时间复杂度为O(logN)。...2路归并排序递归代码实现 2路归并排序代码递归实现特别简单,只要重复把当前区间[left,right]分为两半,对两边子区间[left,mid]和[mid+1,right]分别进行递归,最后将两个已经有序子区间合并为有序区间即可...问题: 怎么表达递归边界(即最后只剩下一个元素)? if(left < right) //当各自剩下一个元素时,left=right,退出if语句 拆分出来数组元素要怎么存放?...参考 算法笔记3105ProblemB 基础排序III:归并排序 版权所有:可定博客 © WNAG.COM.CN 本文标题:《归并排序递归实现》 本文链接:https://wnag.com.cn/898

66820

迭代归并归并排序递归实现解析

前言 归并排序思想上我们已经全部介绍完了,但是同时也面临和快速排序一样问题那就是递归消耗栈帧空间太大了,所以对此我们必须掌握非递归排序思想。...文章目录 前言 一、非递归实现思想 二、非递归实现过程 2.1 非递归实现调整 2.2 调整思路讲解 2.3 归并递归完整代码 三、归并排序总结 文章结语: 一、非递归实现思想 归并实现思想无非就是先将...既然要用非递归那么我们是不是可以这样想 直接吧每个区间定义为 1 进行归并然后再来进行循环到上一组归并排序: 这样就可以利用循环来吧归并排序递归化了 二、非递归实现过程 好了具体思想那么我们懂了...以上就是非递归实现代码了,但你真的以为非递归就这样结束了?...(3-0)虽然是相减了但是我们实际复制是4个数 2.3 归并递归完整代码 // 归并排序递归实现 void MergeSortNonR(int* a, int n) { int* tmp =

17010
  • 归并排序迭代(非递归)实现

    本文主要介绍2路归并排序递归实现。 2路归并排序简单介绍 归并排序算法思想 归并排序算法思想基于对一个数组两个已排序子数组排序–Merge。...对整个数组进行一次小长度Merge算法后,可以构成一个长度翻倍Merge算法条件而进行Merge算法,最终对整个数组实现排序归并排序流程图 下面是归并排序流程图。 ?...2路归并排序迭代分布实现 基础–Merge (一)Merge算法前提:一个数组可以划分为两个已排序子数组,如1 4 7 8 2 5 10,此数组可以划分为两个已排序子数组:1 4 7 8和2 5...O(Nlog(N)) 参考 九大排序归并排序--实现及注意点 算法笔记3105ProblemB 基础排序III:归并排序 版权所有:可定博客 © WNAG.COM.CN 本文标题:《归并排序迭代(...非递归)实现》 本文链接:https://wnag.com.cn/900.html 特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com

    1.5K30

    排序篇】快速排序递归实现归并排序实现

    1 快速排序递归 利用迭代方式来模仿递归,快速排序递归本质也就是它可以拿到那些待排序区间,那么不就说明了只要我们右那些待排序区间就可以不再需要递归了。...归并排序 基本思想: 归并排序(MERGT-SORT)是建立在归并操作上一种有效排序算法,该算法是采用分治(Divide and Conquer)一个非常典型应用。...归并排序核心步骤: 合并时动图: 其实归并排序很简单,像分解过程,不是和快速排序很像嘛,都是传数组和区间。...if (tmp == NULL) { perror("malloc"); exit(-1); } //归并排序核心逻辑,再封装一个函数实现 _MergeSort(a, tmp,...0, n - 1); } 归并排序特性总结: 归并排序缺点在于需要O(N)空间复杂度,归并排序思考更多是解决在磁盘中排序问题 时间复杂度:O(N*logN) 空间复杂度:O(N) 稳定性:稳定

    11510

    归并排序 递归版和非递归实现(java)

    https://blog.csdn.net/gdutxiaoxu/article/details/51292207 归并排序实现(java) 本文固定链接:https://www.zybuluo.com.../xujun94/note/424570 关于二分查找,可以参考我这篇博客二分查找相关算法题 关于归并排序,可以参考我这篇博客归并排序 递归版和非递归实现(java) 关于快速排序...,可以参考我这篇博客 快速排序相关算法题(java) 转载请注明原博客地址: http://write.blog.csdn.net/postedit/51292207 什么是归并排序 归并排序其实就做两件事...“合并”——将划分后序列段两两合并后排序。 首先我们来看一下分解是怎样实现呢?...可以参考我这篇博客二分查找相关算法题 关于归并排序,可以参考我这篇博客归并排序 递归版和非递归实现(java) 转载请注明原博客地址: http://write.blog.csdn.net

    1K10

    排序-归并排序,一种外排序递归,非递归,磁盘?

    这相当于对多个有序数组进行排序归并排序是最适合此场景排序算法。...该算法是将已有的子序列不断进行合并从而最终达到全局有序,一般我们实现都是二路归并,就是两个有序子序列进行合并,但也可以进行多路归并(将大于两个子序列进行合并) 我们通过一个简单归并排序(递归)来分析时间...我们分析上面的代码,看看归并排序复杂度怎么样呢,首先递归终止条件必须确定,就是数组大小小于等于1时,递归终止,我们不断通过对待排序数据array进行折中,从而达到最终二路归并时left,right...复杂度总结 时间复杂度:nlog2(n) 空间复杂度:O(n) 除了递归实现,你能想到非递归怎么实现吗?...非递归实现二路归并排序 一般非递归代替递归递归其实利用了操作系统栈空间存储临时数据,所以两种方案,一是利用栈数据结构,二是利用变量(这种相对局限一点) ?

    1.2K20

    4.比较排序归并排序递归

    归并排序里运用到算法里很重要一个思想——分治法:将原问题分解为几个规模较小但类似于原问题子问题——《算法导论》。...在每一层递归中都有3个步骤:   1.分解问题   2.解决问题   3.合并问题解   举例待排序数组:{6, 5, 3, 1, 7, 2, 4},将它原始序列做分解。 ?   ...将他们进行两两归并排序形成二叉树(也称为2路归并算法),可见二叉树根节点即为最终序列。在这个过程中我们完成了剩余两个步骤:解决问题和合并问题。 ?   理论很简单,实践很“复杂”。...对于归并排序理论从上面的二叉树就看很明白,将原始待排序数组不断分解最后看成是二叉树叶子节点,再把它们两两排形成新节点,逐渐归并为一个节点,此时节点即为排好序数组序列。   ...Java 1 package com.algorithm.sort.merge; 2 3 import java.util.Arrays; 4 5 /** 6 * 归并排序递归

    60280

    【数据结构与算法】:非递归实现快速排序归并排序

    1.非递归实现快速排序 快速排序递归实现主要依赖于栈(stack)来模拟递归过程中函数调用栈。...递归版本快速排序通过递归调用自身来处理子数组,而非递归版本则通过手动管理一个栈来跟踪接下来需要排序子数组边界 那么怎样通过栈来实现排序过程呢?...思路如下: 使用栈实现快速排序是对递归版本模拟。在递归快速排序中,函数调用栈隐式地保存了每次递归调用状态。...,也是一次取一组进行排序递归寻找每个区间 2.归并排序 假如我们已经有了两个已经排序数组,我们如何让他们并为一个有序数组呢?...下面是归并排序算法步骤: 递归分解数组:如果数组长度大于1,首先将数组分解成两个部分。

    42910

    数据结构排序——详细讲解归并排序(c语言实现递归及非递归

    上次是快排和冒泡:数据结构排序——详解快排及其优化和冒泡排序(c语言实现、附有图片与动图示意) 今天为大家带来归并排序 1.基本思想 归并排序是一种分治算法,它将序列分成两个子序列,分别对子序列进行排序...在合并子序列过程中,需要比较两个子序列元素,并按顺序将它们合并成一个有序序列 注意:归并排序关键在于合并两个有序子序列,这一步需要额外空间来存储中间结果。...在实际实现中,可以使用递归或非递归方式来完成归并排序 2.递归实现 递归归并排序: 如果序列长度小于等于1,无需排序,直接返回 将序列分成两个子序列,分别进行递归归并排序 合并两个已排序子序列...(int)); PrintArray(a, sizeof(a) / sizeof(int)); return 0; } 3.非递归实现递归实现归并排序是一种迭代式排序算法,它避免了递归调用带来额外开销...,通常使用循环和迭代来实现归并排序过程: 确定归并区间思路:对于给定数组,首先将相邻元素两两归并(gap=1),然后将归并区间长度不断扩大,依次归并相邻区间、长度为 2 区间、长度为

    18310

    归并排序含非递归

    1.归并排序原理 归并排序是建立在归并操作上一种有效排序算法,该算法是采用分治法一个非常典型应用。...如图所示: 2.实现归并排序 归并排序需要开额外空间来辅助实现 之所以不在原数组实现,是因为如果你使用交换方式来进行排序,可能会将原数组已经排好序部分又一次变回无序,而使用令数组向后移动方式进行对应排序...归并排序需要开额外空间,但每次递归都要开空间显然是不合理,因此我们使用一个函数来完成递归部分。...思考一下,新创建函数参数应该有哪些,首先得有原数组,其次得有我们开辟好数组,而我们要如二叉树一般形成对应递归,显然需要区间,而区间形成需要两个数来辅助,因此可以传递两个代表区间数进来,可以取名为...memcpy(arr+begin,a+begin,(end-begin+1)*sizeof(int)); } 2.5测试 3.非递归实现归并排序 根据我们之前排序我们可以看到它本质是和预排序差不多形态

    16010

    5.比较排序归并排序(非递归

    在上一节中讲解了归并排序递归版《4.比较排序归并排序递归)》,通常来讲,递归归并排序要更为常用,本节简单介绍下非递归归并排序。...思路和递归版相同,均为先分解后合并,非递归重点在于如何确定并合理分解待排序数组。   对于递归我们是这么做: ?   ...对于非递归来讲,切分不向递归从大到小,非递归实际上从一开始构建算法时候都从小到大。   第一次切分排序就确定最小单位为1个数字,将2个数字组合为一组。 ?   ...也就是说非递归归并排序中分解依据为:从切分水长度为1开始,一次归并变回原来2倍。每完成一次归并则 len = len * 2。   ...(非递归) 19 * 从切分数组长度为1开始,一次归并变回原来长度2倍 20 * @param nums 待排序数组 21 * @return 排好序数组 22

    2.4K90

    递归 —— 二分查找法 —— 归并排序

    PS:什么是递归、二分查找、归并排序。...递归排序大家都不陌生,递归简单说就是自己在没有达到目的同时在此调用本身,把一个大问题层层转化为和原问题相似的小问题解决,递归需要有边界条件、递归前进段和递归返回段。...归并排序(MERGE-SORT)是建立在归并操作上一种有效排序算法,该算法是采用分治法(Divide and Conquer)一个非常典型应用。...3:归并排序 归并排序(MERGE-SORT)是建立在归并操作上一种有效排序算法,该算法是采用分治法(Divide and Conquer)一个非常典型应用。...归并排序条件、使用优点 通过两个不同有序数组,互相比较按照比较大小排序 把一个无序数组分成N个数据,每个数据本身比较一次,之后再和下一个数组比较并合并,以此类推。

    1.4K40

    javaScript实现归并排序

    归并排序是一个O(nlogn)算法,其基本思想就是一个分治策略,先进行划分,然后再进行合并,下面举个例子。...它是一个在效率上高于一般排序算法.一般排序:冒泡, 插入, 选择排序时间复杂度为O(N^2), 而归并排序时间复杂度为O(N*LOG N),如果N(及排序数目)是10000.那么N^2就是100000000...也就是如果这个数量数据.如果用归并排序需要40S时间,那么用插入排序则需要28个小时....归并排序算法核心: 核心思想就是分治算法.先进行划分,再进行排序归并.归并两个有序数组.即归并两个有序数组A和B,然后就有了包含这两个新数组数组C....Math.floor(array.length / 2); var left = array.slice(0, mid); var right = array.slice(mid); /* 递归分别对左右两部分数组进行排序合并

    69480

    go实现归并排序

    介绍归并排序(MERGE-SORT)是利用归并思想实现排序方法,该算法采用经典分治策略.分治法将问题分成一些小问题然后递归求解,而治阶段则将分阶段得到各答案"修补"在一起,即分而治之)。...归并排序是用分治思想,分治模式在每一层递归上有三个步骤:分解(Divide):将n个元素分成个含n/2个元素子序列。解决(Conquer):用合并排序法对两个子序列递归排序。...合并(Combine):合并两个已排序子序列已得到排序结果。...实现实现上有点类似二叉树一个后序遍历, 先左右, 最后再根(合并)package mainimport "fmt"func main() {arr := []int{0, 8, 0, 10, 5, 4..., 2, 0, 1, 7}ret := MergeSort(arr)fmt.Println(ret)}// 归并排序func MergeSort(nums []int) []int {arrLen :=

    38740

    如何实现归并排序

    归并排序 归并排序是分而治之排序算法。 划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序。...递归写法 归并排序递归写法思想是,设定一个函数函数实现目的是「让int[] arr在L ~ R位置上有序」,处理过程是从L ~ R上找一个中间位置M,递归调用该函数,「让int[] arrL ~...因此,归并排序使用递归方法实现方法是:「整体是递归,左边排好序+右边排好序+merge让整体有序」。...递归函数调用过程 拿代码中数组分析,过程大概就是这样子滴: ? 递归归并排序图解 非递归写法 ❝任何递归写法都能转换成非递归写法。...arr[0~3]和arr[4~7]两部分数组 排序后:[6, 9, 13, 15, 15, 17, 18, 20] 这里只是归并排序递归写法,思想也是分而治之!

    55310

    Python实现归并排序

    排序列表是无序,使用二分法递归地将列表最终拆分成只有一个元素子表,只有一个元素列表一定是有序,此时递归往回合并,即可依次将待排序列表拆分然后合并成一个有序列表。...二、归并排序原理 归并排序原理如下: 1....实现归并排序函数merge_sort(array)时,递归调用merge(left_array, right_array)函数。...所以归并排序递归地将待排序列表进行拆分,直到拆分成只有一个元素列表,然后调用merge(left_array, right_array)函数进行合并,这样依次递归合并,最终实现归并排序。...归并排序一直对待排序列表进行拆分,需要进行logn次拆分,在每一次递归合并中,需要进行n次比较和添加。

    1.2K40

    归并排序python实现

    归并排序python实现 归并排序 归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法 首先是一个例子 ? 原序先通过一半一半拆分,然后: ?...然后再一步一步向上合并,在合并过程中完成了排序,合并排序算法如下: def merge(s1,s2,s): """将两个列表是s1,s2按顺序融合为一个列表s,s为原列表""" #...,互相比较选择较小那个数放入最后序列,s是原序列,所以在一开始会有与len(s)比较 完整算法 算法中通过递归并调用merge函数完成排序 def merge(s1,s2,s): """将两个列表是...i += 1 else: s[i+j] = s2[j] j += 1 def merge_sort(s): """归并排序...= s[0:mid] s2 = s[mid:n] # 子序列递归调用排序 merge_sort(s1) merge_sort(s2) # 合并 merge

    56660
    领券