首页 > 其他分享 >学习日历day02 分治法-归并排序(递归版)

学习日历day02 分治法-归并排序(递归版)

时间:2024-11-12 17:50:35浏览次数:3  
标签:归并 遍历 后序 day02 日历 二叉树 排序 节点

归并排序

快速排序类似于二叉树前序遍历(根节点、左子节点、右子节点)

归并排序类似于二叉树后序遍历(左子节点、右子节点、根节点)

归并排序的递归实现

归并排序:持续分割区间,直到剩下最后一个节点,在归并排序的过程中,数组的分割可以看作是在构建一棵二叉树。具体来说,每次分割都将当前数组分为两半,这对应于二叉树中节点分裂成左右两个子节点的过程。当数组不能再分时,就相当于到达了二叉树的叶子节点。

归并排序与二叉树后序遍历之间的相似性体现在合并阶段。在二叉树的后序遍历中,我们首先访问左子树,然后访问右子树,最后访问根节点。而在归并排序的合并阶段,也是先处理(或说排序)左边的部分,再处理右边的部分,最后合并这两个已经排序好的部分。这个过程正好符合后序遍历的顺序:先解决子问题(左子树、右子树),再解决父问题(根节点)。

简而言之,归并排序的分解过程像是从根到叶子节点的前序遍历,而其合并过程则类似于从叶子节点回到根节点的后序遍历。这种结构上的相似性使得人们常常把归并排序与二叉树的后序遍历联系起来。不过需要注意的是,这只是从操作顺序上的一种类比,并不是严格意义上的相同,因为归并排序涉及的具体

# 归并排序递归版
def merge_sort(arr):
    if len(arr)<=1:
        return arr
    mid=len(arr)//2
    llist=arr[:mid]
    rlist=arr[mid:]
    leftsorted=merge_sort(llist)#程序执行完毕才会返回,所以此时的leftsorted一定是排序好的左边数组
    rightsorted=merge_sort(rlist)
    return merge(leftsorted,rightsorted)

def merge(l,r):
    i=0
    j=0
    temp=[]
    while i<len(l) and j<len(r):
        if l[i]<r[j]:
            temp.append(l[i])
            i+=1
        else:
            temp.append(r[j])
            j+=1
    while i<len(l):
        temp.append(l[i])
        i+=1
    while j<len(r):
        temp.append(r[j])
        j+=1
    return temp

a=[33,43,2,5,24,3,73,86,45,23,97,100]
arr1=merge_sort(a)
print(arr1)

操作(如比较和交换元素)与二叉树遍历的操作完全不同。

标签:归并,遍历,后序,day02,日历,二叉树,排序,节点
From: https://blog.csdn.net/fearless9/article/details/143610816

相关文章

  • day02-docker快速入门
    1.快速入门1.1.部署MySQL使用Docker安装,仅仅需要一步即可,在命令行输入下面的命令(建议采用CV大法):dockerrun-d\--namemysql\-p3306:3306\-eTZ=Asia/Shanghai\-eMYSQL_ROOT_PASSWORD=123\mysql安装完成1.2命令解读 dockerrun-d:创建并运行......
  • Day02-映射(mapping)
    1.映射(Mapping)可以理解为对文档及其字段进行索引或存储的方式。可以拿Mapping和关系型数据库中的schema类比,schema在关系型数据库中指:库表包含的字段及字段存储类型等基础信息。下文中映射等价于Mapping。Elasticsearch映射,描述了文档可能具有的字段、属性、每个字段的数据......
  • 算法学习—归并排序
    1.算法介绍 归并算法是一种由冯·诺伊曼发明的分治算法,相较于普通排序算法时间复杂度较低,运行效率高。通常情况下,归并算法的时间复杂度为O(nlogn)。2.算法思想以及大致步骤 归并算法主要运用到了分治以及归并的思想,主要步骤如下:首先将一个无序数组分为n个有序的单个数......
  • 基于SpringBoot高校教研室教学日历管理系统的设计与实现
    博主主页:一点源码博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计,SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Python、Nodejs、小程序、安卓app、大数据等设计与开发......
  • 插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序
    #include<stdio.h>#include<stdlib.h>//插入排序voidInsertSort(intA[],intn){inti,j,temp;for(i=1;i<n;i++){temp=A[i];j=i-1;while(j>=0&&A[j]>temp){A......
  • 11.5 非递归的归并排序
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintn;inthelp[1008611];intarr[1008611];voidmerge(intl,intm,intr){inti=l;inta=l;intb=m+1;while(a<=m&&b<=r){help[i++]=arr[a]......
  • 基于Python Tkinter和Calendar模块实现:个人日历应用
    1.项目概述本项目旨在开发一个基本的个人日历应用,帮助查看日历、添加和管理个人事件。该应用基于Python的tkinter图形界面库和calendar模块,能够动态展示一个月的日历,并允许在指定日期添加事件。通过该应用,可以在日历上直观地查看每个月的安排,方便管理日常事务。2.技术栈与......
  • Day02
    标识符和关键字标识符常见的标识符数据类型int、short、long、float、double、byte、char、string类型转换变量常量运算符计算2*8最快的方式是移位三元运算符:?:包机制......
  • ECharts饼图-日历饼图,附视频讲解与代码下载
    引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个饼图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供详细的视频讲解和代码下载链接,帮助大家快速上手。一、图表效果预览 二、视......
  • python 入门九大排序:1冒泡排序2插入排序3选择排序4快速排序5归并排序6堆排序7计数排序
    1冒泡排序:冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。代码如下:importnumpyasnpdefbubbling(arr):n=len(arr)foriinrange(n-1):forjinrange(n-i-1):ifarr[j......