基于Python3的数据结构与算法 - 07 归并排序

一、归并

引入

假设现在的列表分两段有序,如何将其合并成为一个有序列表。

这种操作成为一次归并。

归并的思路

  1. 分别对两个列表进行遍历,比较两个列表中的最小值,将更小的取出来。
  2. 取出后一次进行上操作,直到其中一个列表中的元素被取完。
  3. 再直接将列一个列表中的剩下元素全部取出。

实现代码如下:

def merge(li, low, mid, high):# 两个列表合并一块,最左边为low,最右边为high,第一个列表的最后一个元素下标为mid# 则列表被分为两部分,一个为low - mid,另一个为mid+1 - high# 最开始定义两个箭头 + 一个存放返回的空列表i = lowj = mid +1ltmp = []while i<= mid and j <= high:if li[i] < li[j]:  # 此时i小,则将i对应的数取出,箭头向下移动一位ltmp.append(li[i])i += 1else:ltmp.append(li[j])j += 1# 当while执行完后必定是两部分中的一个没有剩余数字while i <= mid:   #对应左边的列表还有剩余ltmp.append(li[i])i += 1while j <= high:   #对应右边的列表还有剩余ltmp.append(li[j])j += 1# 最后将数值返回lili[low:high+1] = ltmpli = [1,4,7,2,5,8]
print(li)
merge(li, 0, 2, 5)
print(li)

输出结果如下:

此时我们实现了将两个有序列表合并为一个有序列表。

二、归并排序的实现

大致分为三步:

  • 分解:将列表越分越小,直至分成一个元素。
  • 终止条件:一个元素是有序的
  • 合并:将两个有序列表归并,列表越来越大。

代码的思路:主要运用了递归,对于整个无序列表,我们想要将其变为有序列表,主要采用以下三步:

  1. 确定好mid后,先将左边的排为有序
  2. 再将右边的拍为有序
  3. 最后采用上面提到的归并的思路,将两个有序的列表归并为一个列表。
def merge_sort(li, low, high):if low <  high:mid = (low+high) // 2merge_sort(li,low,mid)merge_sort(li,mid+1,high)merge(li,low,mid,high)li = [1,4,7,2,5,8,3,6,9]
print(li)
merge_sort(li, 0, len(li)-1)
print(li)

输出的结果如下:

因此,整个综合代码如下所示:

def merge(li, low, mid, high):# 两个列表合并一块,最左边为low,最右边为high,第一个列表的最后一个元素下标为mid# 则列表被分为两部分,一个为low - mid,另一个为mid+1 - high# 最开始定义两个箭头 + 一个存放返回的空列表i = lowj = mid +1ltmp = []while i<= mid and j <= high:if li[i] < li[j]:  # 此时i小,则将i对应的数取出,箭头向下移动一位ltmp.append(li[i])i += 1else:ltmp.append(li[j])j += 1# 当while执行完后必定是两部分中的一个没有剩余数字while i <= mid:   #对应左边的列表还有剩余ltmp.append(li[i])i += 1while j <= high:   #对应右边的列表还有剩余ltmp.append(li[j])j += 1# 最后将数值返回lili[low:high+1] = ltmpdef merge_sort(li, low, high):if low <  high:mid = (low+high) // 2merge_sort(li,low,mid)merge_sort(li,mid+1,high)merge(li,low,mid,high)li = [1,4,7,2,5,8,3,6,9]
print(li)
merge_sort(li, 0, len(li)-1)
print(li)

 三、归并排序的复杂度

1. 时间复杂度

一次归并的时间复杂度为O(n),可以参考上图中的分解和合并考虑归并算法的时间复杂度。

每次进行的操作的复杂度为O(n),共有O(logn)层,因此总共的时间复杂度为O(nlogn)

2. 空间复杂度

因为在merge中我们开辟了一个空间ltmp[],因此空间复杂度为O(n).

pyhton中的sort方法是基于归并排序的。

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

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

相关文章

1分钟学会Python字符串前后缀与编解码

1.前缀和后缀 前缀和后缀指的是&#xff1a;字符串是否以指定字符开头和结尾 2.startswith() 判断字符串是否以指定字符开头&#xff0c;若是返回True&#xff0c;若不是返回False str1 "HelloPython"print(str1.startswith("Hello")) # Trueprint…

【转载】深度学习笔记——详解损失函数

原文链接: https://blog.csdn.net/weixin_53765658/article/details/136360033 CSDN账号: Purepisces github账号: purepisces 希望大家可以Star Machine Learning Blog https://github.com/purepisces/Wenqing-Machine_Learning_Blog 损失函数 根据您使用的神经网络类型和数…

力扣SQL50 进店却未进行过交易的顾客 查询

Problem: 1581. 进店却未进行过交易的顾客 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 山山山林老木 左连接查询筛选 transation_id 为 null 的值group by customer_id Code select v.customer_id ,count(customer_id) count_no_trans from Visits v left jo…

java找工作之JavaWeb(一)

JavaWeb 一个web应用有多部份组成&#xff08;静态web&#xff0c;动态web&#xff09; html&#xff0c;css&#xff0c;jsjsp&#xff0c;servletjava程序jar包配置文件(Properties) web应用程序编写完毕后&#xff0c;若想提供给外界访问&#xff0c;需要一个服务器来统一…

3694-51-7,3,5-Dinitro-1,2-phenylenediamine,合成其他化合物的重要中间体

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;3694-51-7&#xff0c;3,5-Dinitro-1,2-phenylenediamine&#xff0c;3,5-二硝基-1,2-苯二胺;3,5-二硝基苯-1,2-二胺 一、基本信息 【产品简介】&#xff1a;3,5-Dinitro-1,2-phenylenediamine, with the molecular…

一台工控机的能量

使用Docker搭建EPICS的IOC记录 Zstack EPICS Archiver在小课题组的使用经验 以前电子枪调试&#xff0c;用一台工控机跑起束测后台&#xff0c;这次新光源用的电子枪加工回来又是测试&#xff0c;又是用一台工控机做起重复的事&#xff0c;不过生命在于折腾&#xff0c;重复的…

openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划

文章目录 openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划 openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划 完成资源负载管理功能配置前&#xff0c;需要先根据业务模型完成租户资源的规划。业…

【白嫖8k买的机构vip教程】Appium自动化(3):Appium-Desktop界面介绍

Appium-Desktop主界面包含三个菜单Simple、Advanced、Presets Simple界面&#xff1a; Host设置Appium server的ip地址&#xff0c;本地调试可以将ip地址修改为127.0.0.1&#xff1b;Port设置端口号&#xff0c;默认是4723不用修改Start Server 启动 Appium serverEdit Confi…

[SUCTF 2019]EasyWeb --不会编程的崽

个人认为&#xff0c;这题还算有些东西。先来看源码 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if(!empty…

【力扣白嫖日记】550.游戏玩法分析IV

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 550.游戏玩法分析IV 表&#xff1a;Activity 列名类型player_idintdevice_idintevent_datedategames_played…

leetcode--接雨水(双指针法,动态规划,单调栈)

目录 方法一&#xff1a;双指针法 方法二&#xff1a;动态规划 方法三&#xff1a;单调栈 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 黑色的是柱子&#xff0c;蓝色的是雨水&#xff0c;我们先来观察一下雨水的分布情况: 雨水落在凹槽之间&#xff0c;在一个凹槽的…

第三百七十五回

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"相关的内容&#xff0c;本章回中将介绍如何让Text组件中的文字自动换行.闲话休提&#xff0c;让我们一起Talk Flutter吧。 …

《C++进阶--10.多态》

目录 10. 多态 10.1 多态的基本概念 10.2 多态案例一-计算器类 10.3 纯虚函数和抽象类 10.4 多态案例二-制作饮品 10.5 虚析构和纯虚析构 10.6 多态案例三-电脑组装 10. 多态 10.1 多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 静态多态: 函数重载 和 运算…

HTML---Ajax

文章目录 目录 文章目录 前言 一.Ajax概述 二.原生创建Ajax 三,使用Jquery处理Ajax 总结 一.Ajax概述 AJAX&#xff08;Asynchronous Javascript And XML&#xff09;是一种创建交互式网页应用的网页开发技术。它使用Javascript语言与服务器进行异步交互&#xff0c;可以传…

matplotlib.animation 3d姿态动画

目录 演示效果&#xff1a; 演示代码&#xff1a; 保存为gif 演示效果&#xff1a; 演示代码&#xff1a; import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.animation import FuncAnimation# 定义人体关键点…

flutterandroidx支持,【工作经验分享】

基于Linux的pc启动过程 我们都知道&#xff0c;所有的程序软件包括操作系统都是运行在内存中的&#xff0c;然而我们的操作系统一般是存放在硬盘上的&#xff0c;当我们按下开机键的时候&#xff0c;此时内存中什么程序也没有&#xff0c;因此需要借助某种方式&#xff0c;将操…

kubectl 陈述式资源管理方法

目录 陈述式资源管理方法 项目的生命周期 1.创建kubectl create命令 2.发布kubectl expose命令 service的4的基本类型 查看pod网络状态详细信息和 Service暴露的端口 查看关联后端的节点 ​编辑 查看 service 的描述信息 ​编辑在 node01 节点上操作&#xff0c;查看…

Northwestern University-844计算机科学与技术/软件工程-复试注意事项【考研复习】

本文提到的西北大学是位于密歇根湖泊畔的西北大学。西北大学&#xff08;英语&#xff1a;Northwestern University&#xff0c;简称&#xff1a;NU&#xff09;是美国的一所著名私立研究型大学。它由九人于1851年创立&#xff0c;目标是建立一所为西北领地地区的人服务的大学。…

Android13 Audio框架

一、Android 13音频代码结构 1、framework: android/frameworks/base 1.AudioManager.java &#xff1a;音频管理器&#xff0c;音量调节、音量UI、设置和获取参数等控制流的对外API 2.AudioService.java &#xff1a;音频系统服务&#xff08;java层&#xff09;&#xff0c…

在vue2中使用饼状图

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 补充基本的body内容 <div id…