首页
学习
活动
专区
工具
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: 树剩余元素个数。

33410

排序算法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)时就直接使用快速排序

88130
  • 归并排序递归实现

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

    66320

    javaScript实现归并排序

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

    69180

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

    38040

    Python实现归并排序

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

    1.2K40

    归并排序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): """归并排序

    56260

    如何实现归并排序

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

    54810

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

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

    14310

    用 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); } } 实现结果: ?

    60320

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

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

    1.5K30

    归并排序求逆序对数(包括归并排序算法实现及代码)

    算法设计课上老师给出了如上一个问题,让用刚学习归并排序算法来实现求逆序对数。...那么我们很容易想到这个题有一种O(n*n)暴力解法,但这不是我们所需要,所以,要想归并排序实现求逆序对数,那么首先我们要了解并掌握归并排序算法。...所谓归并排序算法,就是采用分治法将问题规模不断缩小,然后合并一个过程。...r); } //归并排序整个数组 void mergeSort(int arr[], int n){//特判,如果数组为空或只有一个元素,那么就不需要排序 if(arr == NULL || n...n); for(int i = 0; i < n; i++){ cout << a[i] << " "; } cout << endl; } return 0; } 那么实现并掌握归并排序算法基础上

    1.1K50

    归并排序解读(基于java实现

    归并排序(Merge Sort)是一种基于分治思想排序算法,它核心思想是将待排序序列分为若干个子序列,然后对每个子序列进行排序,最终合并成完整有序序列。...总体来说,归并排序每一层,合并操作都需要进行n次,而分解操作次数是logn。所以,总时间复杂度可以表示为O(nlogn)。...空间复杂度:归并排序空间复杂度为O(n),其中n表示待排序序列长度。每一层合并操作,都需要使用额外辅助数组来暂存排序结果。这个辅助数组大小与待排序序列长度相等。...由于整个排序过程,会存在多层递归,每一层都会创建一个辅助数组。所以,归并排序空间复杂度是O(n)。...注意点:归并排序空间复杂度是以代价换取了时间复杂度优化,因为它需要额外存储空间来存放辅助数组。实际应用,如果内存空间有限,可能需要考虑归并排序空间消耗。

    17421

    二路归并排序java实现

    转载请注明出处 http://www.cnblogs.com/dongxiao-yang/p/6410775.html 参考引言:排序算法快速排序效率是非常高,但是还有种排序算法效率可以与之媲美...,那就是归并排序归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略排序成两个子数组,然后递归再粗略分两个子数组,直到子数组里面只有一个元素,那么就自然排好序了,可以总结为先排序再递归;...归并排序:先什么都不管,把数组分为两个子数组,一直递归把数组划分为两个子数组,直到数组里只有一个元素,这时候才开始排序,让两个数组间排好序,依次按照递归返回来把两个数组进行排好序,到最后就可以把整个数组排好序..., 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12] merge is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 调试过程输出结果有助于更好理解排序过程...参考资料 1 归并排序原理及时间复杂度 2 白话经典算法系列之五 归并排序实现 3 排序算法之 归并排序 及其时间复杂度和空间复杂度 <!

    85420
    领券