Python篇——数据结构与算法(第三部分:归并排序;快速、归并、堆排序小结;深拷贝和浅拷贝区别)

news2024/9/19 20:53:13

 

1、归并排序——归并

  •  假设现在的列表分为两段有序,如何将其合成为一个有序列表
  • 这种操作称为一次归并

 归并过程描述:(前提是两段列表分别有序)

        两段有序列表进行对比,1和2进行对比选出最小的数,1出列,然后指针向后移,2和3在进行对比,2出列,指针向后移,指向5,以此类推......

# 归并排序
def merge(li, low, mid, high):
    '''
    :param li:列表[AB]
    :param low:A列表的第一个位置
    :param mid:A列表的最后一个位置,mid+1为B列表的第一个位置
    :param high:B列表的最后一个位置
    :return:
    '''
    i = low
    j = mid + 1
    ltmp = []  # 临时列表
    while i <= mid and j <= high:  # 只要左右两边都有数
        if li[i] < li[j]:
            ltmp.append(li[i])
            i = i + 1
        else:
            ltmp.append(li[j])
            j = j + 1
    # 第一部分跳出之后,肯定一部分没数了
    while i <= mid:
        ltmp.append(li[i])
        i += 1
    while j <= high:
        ltmp.append(li[j])
        j += 1
    li[low:high + 1] = ltmp


li = [2, 4, 7, 8, 3, 6, 9, 10]
print(li)
merge(li, 0, 3, 7)
print(li)

2、归并排序——使用归并

  • 之前介绍的归并条件是两个列表分别有序,但是在实际中不会遇到这样的特殊情况,因此我们需要进行以下操作
  • 分解:将列表越分越小,直至分成一个元素
  • 终止条件:一个元素是有序的
  • 合并:将两个有序列表归并,列表越来越大
  • 过程如下图所示:

 

# 归并排序
def merge(li, low, mid, high):
    '''
    :param li:列表[AB]
    :param low:A列表的第一个位置
    :param mid:A列表的最后一个位置,mid+1为B列表的第一个位置
    :param high:B列表的最后一个位置
    :return:
    '''
    i = low
    j = mid + 1
    ltmp = []  # 临时列表
    while i <= mid and j <= high:  # 只要左右两边都有数
        if li[i] < li[j]:
            ltmp.append(li[i])
            i = i + 1
        else:
            ltmp.append(li[j])
            j = j + 1
    # 第一部分跳出之后,肯定一部分没数了
    while i <= mid:
        ltmp.append(li[i])
        i += 1
    while j <= high:
        ltmp.append(li[j])
        j += 1
    li[low:high + 1] = ltmp


def merge_sort(li, low, high):
    '''归并排序'''
    if low < high:  # 至少有两个元素
        # 使用递归分解
        mid = (low + high) // 2
        merge_sort(li, low, mid)
        merge_sort(li, mid + 1, high)
        # 使用merge合并
        merge(li, low, mid, high)


# li = [2, 4, 7, 8, 3, 6, 9, 10]
# print(li)
# merge(li, 0, 3, 7)
# print(li)

li = list(range(100))
import random

random.shuffle(li)
print(li)
merge_sort(li, 0, len(li) - 1)
print(li)

3、归并排序算法的时间复杂度和空间复杂度

  • 时间复杂度O(nlogn)
  • 空间复杂度O(n)(递归)

4、基于前两部分的三种排序算法小结

  •  三种排序算法的时间复杂度都是O(nlogn)
  • 一般情况下,就运行时间而言
    • 快速排序<归并排序<堆排序
  • 三种排序算法的缺点:
    • 快速排序:极端情况下排序效率低
    • 归并排序:需要额外的内存开销
    • 堆排序:在快的排序算法中相对较慢

 

 5、深拷贝和浅拷贝的区别

  • 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存(分支)
  • 深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象,是“值”而不是“引用”(不是分支)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/565785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中的soup.find()方法详解

Python中的soup.find()方法详解 Python语言的简洁、易读性和快速开发的特点已经成为了程序员们的首选语言。其中&#xff0c;BeautifulSoup库作为一个非常好用的库&#xff0c;可以用于解析HTML/XML文档&#xff0c;提取出需要的信息。soup.find()方法是BeautifulSoup库中的一…

chatgpt赋能python:PythonWord目录的介绍

Python Word 目录的介绍 Python 是一种高级编程语言&#xff0c;已经成为世界上最流行的程序设计语言之一。在 Python 中&#xff0c;我们可以使用一些库和模块来完成各种任务&#xff0c;例如文本处理和文件操作。 一个很常见的文本处理任务就是生成和编辑 Microsoft Word 文…

day1 - OpenCV安装与环境配置

本期我们介绍 OpenCV 的背景知识以及如何安装 OpenCV 。 完成本期内容&#xff0c;你可以&#xff1a; 了解 OpenCV 的背景知识掌握安装 OpenCV 及其拓展库 若要运行案例代码&#xff0c;你需要有&#xff1a; 操作系统&#xff1a;Ubuntu 16 以上 或者 Windows10 工具软件…

chatgpt赋能python:PythonTables:为你的数据处理带来更高效的解决方案

Python Tables&#xff1a;为你的数据处理带来更高效的解决方案 Python是一种功能强大且易于使用的编程语言&#xff0c;可以用于各种用途。对于数据处理和分析来说&#xff0c;Python是一个非常受欢迎的选择&#xff0c;因为它有许多强大的库和工具可以使用。其中一个很有用的…

pkcs8-rfc5958

非对称密钥包摘要 本文档定义了私钥信息的语法及其内容类型。 私钥信息包括指定公钥算法的私钥和一组属性。 RFC 5652 中定义的加密消息语法 (CMS) 可用于对非对称密钥格式内容类型进行数字签名、摘要、验证或加密。 本文档废弃了 RFC 5208。 本备忘录的状态 这是一份 Internet…

多线程详解(理论与实践的最佳融合方案)

一.概述 线程简介 总而言之&#xff0c;就是在同一时间&#xff0c;做了不同的事情&#xff0c;正所谓一石二鸟&#xff0c;一箭双雕&#xff0c;赔了夫人又折兵 生活中很多事情都可以看作是多线程的例子。比如&#xff1a; 煮饭&#xff1a;煮饭需要同时加热米饭和煮菜&#…

阿里拆了中台,中台还有未来吗?

hi&#xff0c;我是熵减&#xff0c;见字如面。 近日&#xff0c;阿里在继年初3月份的16N的战略变革的基础上&#xff0c;对持续建设和运营8年的中台的调整终于落地了。 阿里对中台的这一举措&#xff0c;引发了外界对于中台战略是否还有意义的大量质疑和讨论。 甚至有人将中台…

分享一些冷门好用的网站和软件

分享一&#xff1a;UZER UZER是一个功能强大的云端应用空间&#xff0c;可以帮助您将所有的文件和应用程序都集中在一个地方&#xff0c;让您随时随地轻松访问。 以下是它的主要特点&#xff1a; 云存储&#xff1a;UZER提供大量的云存储空间&#xff0c;让您可以安全地存储…

【C++初阶】C++——模板初阶与泛型编程

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 1. 泛型编程2. 函数模板…

C#,码海拾贝(23)——线性方程组求解的复系数方程组的全选主元高斯消去法之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary&g…

MyBatis-Plus03_分页插件、自定义分页、乐观锁

目录 ①. 分页插件 ②. xml自定义分页 ③. 乐观锁 ①. 分页插件 ①. MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能 ②. 添加配置类 Configuration public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlu…

MyBatis-Plus02 条件构造器QueryWrapper、UpdateWrapper、Condition、LambdaQuery用法详解

目录 ①. 条件构造器与常用的接口 ②. QueryWrapper ③. UpdateWrapper ④. Condition——简化代码开发 ⑤. LambdaQueryWrapper ⑥. LambdaUpdateWrapper ①. 条件构造器与常用的接口 ①. Wrapper介绍&#xff1a; 条件构造器&#xff08;Wrapper&#xff09;的作用&…

【mmcv安装使用】

文章目录 一、前言二、mmcv安装1.安装方案a2.安装方案b 三、mmclassification使用1.目录说明2.数据集3.根据自己数据修改文件4.demo测试5.测试结果6.数据增强可视化7.日志分析 个人网站 一、前言 MMLab是香港中文大学深圳研究院的一个计算机视觉和深度学习研究团队&#xff0c…

chatgpt赋能python:PythonUSBHID:利用Python控制USB设备

Python USB HID: 利用Python控制USB设备 简介 USB HID&#xff08;Human Interface Device&#xff09;是一种USB设备类型&#xff0c;它允许用户与设备进行交互。许多设备&#xff0c;如键盘、鼠标、游戏控制器等&#xff0c;都使用USB HID协议进行通信。 Python是一种强大…

chatgpt赋能python:PythonUp:优秀的Python教育平台

Python Up: 优秀的Python教育平台 Python学习的重要性 随着大数据、人工智能等技术的蓬勃发展&#xff0c;Python作为一种可读性强、代码简洁、可扩展性好的编程语言&#xff0c;已经成为数据科学领域中最受欢迎的编程语言之一。因此&#xff0c;Python学习已成为现在最流行的…

Linux基础系统设置

文章目录 Linux基础系统设置网络设置(手动设置与DHCP自动获取)手动设置IP网络参数自动获取IP参数修改主机名 日期与时间设置时区的显示与设置时间的调整用ntpdate手动校时 语系设置防火墙简易设置案例 Linux基础系统设置 我们的CentOS 7 系统其实有很多需要设置&#xff0c;包…

什么是EMC?什么是EMI?什么是EMS?电磁兼容详解(一)

EMC&#xff08;Electro Magnetic Compatibility&#xff0c;电磁兼容&#xff09;是指电子、电气设备或系统在预期的电磁环境中&#xff0c;按设计要求正常工作的能力。它是电子、电气设备或系统的一种重要的技术性能&#xff0c;其包括三方面的含义&#xff1a; &#xff08…

离散数学_十章-图 ( 1 ):图的相关定义

&#x1f4f7;10.1 图 1. 图的定义2. 有限图 和 无限图3. 多重边、多重图4. 简单图 和 伪图5. 有向图 、无向图 、混合图5.1 简单有向图5.2 多重有向边 → 有向多重图 表1 图术语 图是一种非线性的数据结构&#xff0c;也是由顶点和连接顶点的边构成的离散结构 根据图中的边是…

lintcode-图的拓扑排序(java)

拓扑排序 拓扑排序-lintcode原题题目介绍解题思路代码演示解题方法二 (参考,不用掌握)前置知识 图的拓扑序和深度优先遍历和广度优先遍历 拓扑排序-lintcode原题 127.拓扑排序-原题链接,可以点进去测试 题目介绍 描述 给定一个有向图&#xff0c;图节点的拓扑排序定义如下: 对…

【利用AI让知识体系化】拍了拍AST

文章目录 I. 介绍什么是抽象语法树&#xff08;AST&#xff09;AST 和编译器的关系AST 在前端开发中的应用 II. 构建 AST词法分析器&#xff08;Lexer&#xff09;的作用语法分析器&#xff08;Parser&#xff09;的作用如何使用工具生成 AST III. AST 的结构AST 的节点类型如何…