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

归并排序在python3中的实现

归并排序是一种经典的排序算法,它采用分治的思想,将待排序的序列不断拆分成更小的子序列,然后再将这些子序列合并成有序的序列。在Python3中,可以通过递归实现归并排序。

以下是归并排序在Python3中的实现代码:

代码语言: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
    
    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

以上代码中,merge_sort函数是归并排序的入口函数,它接受一个待排序的数组作为参数,并返回排序后的数组。在merge_sort函数中,首先判断数组的长度是否小于等于1,如果是,则直接返回该数组。否则,将数组拆分成两个子数组,分别调用merge_sort函数进行递归排序,然后再调用merge函数将两个有序的子数组合并成一个有序的数组。

merge函数用于合并两个有序的子数组。它创建一个空数组result,然后使用两个指针ij分别指向左子数组和右子数组的起始位置。通过比较指针所指的元素大小,将较小的元素添加到result数组中,并将对应的指针向后移动一位。最后,将剩余的元素依次添加到result数组的末尾,然后返回result数组。

归并排序的时间复杂度是O(nlogn),其中n是待排序数组的长度。它是一种稳定的排序算法,适用于各种规模的数据集。

腾讯云提供了云服务器、云数据库、云存储等多种产品,可以满足云计算领域的需求。具体推荐的腾讯云产品和产品介绍链接地址可以参考腾讯云官方网站。

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

相关·内容

Python3实现快速排序、归并排序、堆

,先随机选取范围内的一个下标,该下标对应的值称为主元,然后将小于主元的值挪到主元 的左边,大于主元的值挪到主元的右边,即确保主元在正确的位置。...每轮排序确定一个主元,该轮排序完成后待排序的两个数组的长度变为原来的一半,可以看做是一个树, 根节点是原数组,每一轮会分裂一次,每个节点被分裂成2个子节点,直到该节点长度为1,不需再进行排序...,归并的时候每次从两个 数组中选择最小的元素。...归并排序是稳定算法,时间复杂度为nlogn :param data: 待排序的数组 """ def sort(start, end): if start < end...""" :param cur_idx: 待调整的子树的根节点位置 :param length: 树中剩余的元素个数。

33610

排序算法在JDK中的应用(一)归并排序

作者|杨旭 来源| https://blog.csdn.net/Alex_NINE/article/details/90612759 JDK8中的排序算法 JDK中对于数组的排序使用比较的多的是Arrays.sort...()和Arrays.parallelSort(),前者是传统的排序算法,后者是JDK8新增的并行排序算法,基于fork/join框架,今天主要是分析Arrays.sort()的底层实现。...array slice if possible for merging * 在条件允许的情况下,使用给定的辅助空间对指定的数组范围内进行排序。...int[] t = a; a = b; b = t; int o = ao; ao = bo; bo = o; } } 以上便是JDK对于sort排序中归并排序部分的优化处理...,还有个我不是很理解的条件就是当带待排序的数组中相等的元素子序列长度大于等于MAX_RUN_LENGTH(33)时就直接使用快速排序。

90030
  • 归并排序的递归实现

    本文主要介绍2路归并排序的递归实现。 2路归并排序的简单介绍 下面是归并排序的流程图。 ?...可以看到,每次程序都将数字两两分组(n/2个组),组内单独排序,最后将这些组两两合并,生成n/4个组,组内再单独排序。直到最后只剩下一个组为止。 2路归并排序的时间复杂度为O(logN)。...2路归并排序的递归代码实现 2路归并排序的代码递归实现特别简单,只要重复把当前区间[left,right]分为两半,对两边的子区间[left,mid]和[mid+1,right]分别进行递归,最后将两个已经有序的子区间合并为有序区间即可...)是否的第j个元素(mid+1)(i=j) temp[index++] = a[i++]; else //哪个数组的相应元素更小就先加入,并统计归并后的数组元素个数...参考 算法笔记3105ProblemB 基础排序III:归并排序 版权所有:可定博客 © WNAG.COM.CN 本文标题:《归并排序的递归实现》 本文链接:https://wnag.com.cn/898

    67020

    javaScript实现归并排序

    归并排序是一个O(nlogn)的算法,其基本思想就是一个分治的策略,先进行划分,然后再进行合并,下面举个例子。...它是一个在效率上高于一般排序的算法.一般排序:冒泡, 插入, 选择排序的时间复杂度为O(N^2), 而归并排序的时间复杂度为O(N*LOG N),如果N(及排序项的数目)是10000.那么N^2就是100000000...也就是如果这个数量的数据.如果用归并排序需要40S的时间,那么用插入排序则需要28个小时....归并排序算法的核心: 核心思想就是分治算法.先进行划分,再进行排序归并.归并两个有序的数组.即归并两个有序的数组A和B,然后就有了包含这两个新数组的数组C....即一次拿出A和B的数组项进行比较.小的就插入到新容器C中.直到一方已经插入完毕.如果另一方还有剩余那么就表示剩余的是有序的而且比较大的.那么就直接连接到C数组容易的后面即可.

    69980

    Python实现归并排序

    一、归并排序简介 归并排序(Merge Sort)是建立在归并操作上的一种效率很高的排序算法,比较占用内存。该算法是分治法(Divide and Conquer)的一个典型应用。...所以归并排序中递归地将待排序列表进行拆分,直到拆分成只有一个元素的列表,然后调用merge(left_array, right_array)函数进行合并,这样依次递归合并,最终实现归并排序。...四、归并排序的时间复杂度和稳定性 1. 时间复杂度 在归并排序中,不管待排序列表的初始状态如何,都不影响排序的时间复杂度。...归并排序一直对待排序列表进行拆分,需要进行logn次拆分,在每一次递归合并中,需要进行n次比较和添加。...稳定性 在归并排序合并的过程中,如果有相等的数据,会先添加左表的数据到新列表中,再添加右表的数据,这不会改变相等数据的相对位置。所以归并排序是一种稳定的排序算法。

    1.2K40

    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 :=

    40340

    归并排序python实现

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

    56860

    归并排序代码实现

    归并排序 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n。...输出格式 输出共一行,包含 n 个整数,表示排好序的数列。...数据范围 1≤n≤100000 输入样例: 5 3 1 2 4 5 输出样例: 1 2 3 4 5 算法思路 算法的时间复杂度的话:最差的时间复杂度也有O(nlogn) 这个题需要记住的是这个归并排序的模板...那么也就意味着所有子区间都成了有序的序列。...(没有元素和一个元素算作序列有序) 然后不断将已有序的子序列递归合并,最终得到完全有序的序列 C++ #include using namespace std; const int

    2600

    如何实现归并排序?

    递归写法 归并排序递归写法的思想是,设定一个函数,函数实现的目的是「让int[] arr在L ~ R位置上有序」,处理过程是从L ~ R上找一个中间位置M,递归调用该函数,「让int[] arr的L ~...因此,归并排序使用递归方法实现的方法是:「整体是递归,左边排好序+右边排好序+merge让整体有序」。...拷贝左侧首项的值 否则: 拷贝右侧部分首值 将元素拷贝进原来的数组中 代码实现: public class MergeSort { public static void main...递归函数调用过程 拿代码中的数组分析,过程大概就是这样子滴: ? 递归归并排序图解 非递归写法 ❝任何递归写法都能转换成非递归写法。...针对代码中的数组int[] arr={18, 15, 13, 17, 6, 20, 15, 9},其排序过程动图演示: ? 归并排序动态演示 归并排序的时间复杂度 ?

    55710

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

    文章目录 前言 一、非递归实现的思想 二、非递归实现的过程 2.1 非递归实现的调整 2.2 调整思路讲解 2.3 归并非递归完整代码 三、归并排序的总结 文章结语: 一、非递归实现的思想 归并实现的思想无非就是先将...每个数都递归 分割为一个小区间然后再进行排序,之后递归 回溯 上一个区间 这时 上一个区间都排好了所以可以在进行排序就这样循环上去。...既然要用非递归那么我们是不是可以这样想 直接吧每个区间定义为 1 进行归并然后再来进行循环到上一组归并排序: 这样就可以利用循环来吧归并排序非递归化了 二、非递归实现的过程 好了具体思想那么我们懂了...(3-0)虽然是相减了但是我们实际复制的是4个数 2.3 归并非递归完整代码 // 归并排序非递归实现 void MergeSortNonR(int* a, int n) { int* tmp =...归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。

    19710

    【排序篇】快速排序的非递归实现与归并排序的实现

    为此我们只需要用一个容器来存储这些区间就可以了,在众多的数据结构中我选择利用栈来实现这个方法,如果你要用队列也可以,只是存储区间而已。那么如何获取这些区间呢?...归并排序 基本思想: 归并排序(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) 稳定性:稳定

    12410

    用 JavaScript 实现归并排序

    在本文中,我们学习 Merge Sort 背后的逻辑,并用 JavaScript 实现。最后,在空间和时间复杂度方面将归并排序与其他算法进行比较。...归并排序 用 JavaScript 实现归并排序 首先实现一个将两个已排序子数组合并为一个已排序数组的函数 merge() 。...在这个过程中,从子数组中删除了被选择的元素(通过 shift() 函数实现)。继续这个过程,直到其中一个子数组变为空。最后把非空子数组的剩余元素(因为它们已经被排序)插入主数组的最后面。...现在有了合并两个已排序数组的代码,接下来为实现归并排序算法的最终代码。...另一种常见的减少归并排序运行时间的方法是在到达相对较小的子数组时(大约 7 个元素)使用插入排序。这是因为插入排序在处理小型或几乎排好序的数组时表现非常好。

    1.5K40

    排序算法Java代码实现(四)—— 归并排序

    本篇内容: 归并排序 归并排序 算法思想: 将两个或两个以上的有序表合并成一个新的有序表, 即把待排序序列分成若干个子序列,每个子序列是有序的,然后在把有序子序列合并为整体有序序列....此算法分为两步: (1)把数组等长切分; (2)把切分后的数组进行排序,然后合并; 通过切分方法的递归调用,可以将数组切分到最小(2个元素)的组合; 代码: (1)合并两个数组的方法: //将两个数组合并...[high-low+1]; int pLeft = low; int pRight = mid+1; int k = 0; //先把较小的数移到新数组中...* 即把待排序序列分成若干个子序列,每个子序列是有序的,然后在把有序子序列合并为整体有序序列 * */ public static void MergeSorting(int...); //左右合并 Merge(array,low,mid,high); } } 实现结果: ?

    61420

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

    本文主要介绍2路归并排序的递归实现。 2路归并排序的简单介绍 归并排序的算法思想 归并排序的算法思想基于对一个数组的两个已排序子数组的排序–Merge。...对整个数组进行一次小长度的Merge算法后,可以构成一个长度翻倍的Merge算法的条件而进行Merge算法,最终对整个数组实现排序。 归并排序的流程图 下面是归并排序的流程图。 ?...,所以各选一个进行比较之后就可确定更小元素在排好序的数组中的位置,而无需考虑其他的问题。...2、参数控制 因为原数组的长度可能为奇数,而step为2的幂,所以会存在第一次排序时,最后一个子数组没有归并对象,在之后的排序中,两边数组的长度不等的情况,若不加区别控制,则会造成数组越界的问题。...O(Nlog(N)) 参考 九大排序之归并排序--实现及注意点 算法笔记3105ProblemB 基础排序III:归并排序 版权所有:可定博客 © WNAG.COM.CN 本文标题:《归并排序的迭代(

    1.5K30

    归并排序(C语言实现)

    首先了解排序有以下几种类型 然后我们来了解一下他的思想,什么叫归并排序,他又是怎么完成排序的? 1.介绍归并  归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。...该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。...作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法: 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法); 自下而上的迭代; 2.算法步骤 申请空间,使其大小为两个已经排序序列之和...,该空间用来存放合并后的序列; 设定两个指针,最初位置分别为两个已经排序序列的起始位置; 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置; 重复步骤 3...直到某一指针达到序列尾; 将另一序列剩下的所有元素直接复制到合并序列尾。

    11010
    领券