归并排序详细说明及实现-python

news2024/11/24 19:25:06

算法思想:

        设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1

         两两合并,得到(n//2) 个长度为2(n为奇数时,最后一个序列的长度为1)的有序子序列

         再两两合并,……如此重复,直至得到一个长度为n的有序序列为止

 如图:以最后一次合并为例,序列2、5、8、9 和 序列1、4、6、7进行比较

  •                 2 > 1,将 1 加入新列表 ltmp 中第一个位置,两序列都不为空继续比较
  •                 2 < 4,将 2 顺序加入新列表ltmp 中 , 两序列都不为空继续比较
  •                 5 > 4,将 4 顺序加入新列表ltmp 中 , 两序列都不为空继续比较
  •                 5 < 6,将 5 顺序加入新列表ltmp 中 , 两序列都不为空继续比较
  •                 8 > 6,将 6 顺序加入新列表ltmp 中 , 两序列都不为空继续比较
  •                 8 > 7,将 7 顺序加入新列表ltmp 中 , 右边序列为空停止比较,将左边剩余序列全部加入列表ltmp中。本次归并结束。
  •                 将新列表ltmp 赋值给原列表相应位置元素。

当剩下两个序列且分别有序时,只要一次合并就可以使整个序列有序。

可以总结出二路归并基本操作是将待排序列中相邻的两个有序子序列合并成一个有序序列。

 归并排序算法分析:

归并排序每一层都是n个数不变,每一层的复杂度为O(n),整个归并排序需进行m(m=log2n)趟2路归并,所以归并排序总的时间复杂度为O(nlog2n)。在实现归并排序时,需要和待排记录等数量的辅助空间,空间复杂度为O(n)。

 实现思路:

     先将序列分解为单个元素,即相邻元素都为有序序列。将相邻有序序列递归合并到新列表,可以分为下面三个步骤:

1)首先递归分解序列直到出现单个元素(即相邻序列有序)

2)对左部分序列和右部分序列进行归并

3)将归并得到的新序列保存到原序列中对应位置

 实现代码:

def merge(ls, low, mid, high):
    """
    :param ls:  待排序列表
    :param low:   最左下标
    :param mid:   中间下标
    :param high:  最右下标
    :return:    返回一次归并后结果
    """
    i = low
    j = mid + 1
    ltmp = []  # 新开列表,暂存归并结果
    while i <= mid and j <= high:  # 只要左右两边都有数,就能分
        if ls[i] < ls[j]:
            ltmp.append(ls[i])  # 左边与右边逐个对比将小的数加入ltmp新列表
            i += 1
        else:
            ltmp.append(ls[j])
            j += 1
    # while执行完,必定有一部分没数了,序列为空
    while i <= mid:  # 若左边有数则逐个加入列表
        ltmp.append(ls[i])
        i += 1
    while j <= high:  # 若右边有数则逐个加入列表
        ltmp.append(ls[j])
        j += 1
    ls[low:high + 1] = ltmp  # 将一次归并后的列表赋值给原列表


def mergeSort(ls, low, high):
    if low < high:  # 至少两个元素,进行递归
        mid = (low + high) // 2
        mergeSort(ls, low, mid)  # 对左部分递归
        mergeSort(ls, mid + 1, high)  # 对右部分递归
        merge(ls, low, mid, high)  # 对每个部分进行归并,整体有序


ls = [5, 2, 8, 9, 6, 4, 7, 1]
mergeSort(ls, 0, len(ls) - 1)
print(ls)  # [1, 2, 4, 5, 6, 7, 8, 9]

 排序过程如图所示:

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

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

相关文章

【Flink系列】开发篇:1. Flink维表关联方案

数据流往往需要访问外部的数据源来丰富自己的信息&#xff0c;比如通过record中的ip地址查询ip数据库maxmind的GeoIP2 Databases得到ip对应的城市名称&#xff0c;城市经纬度&#xff0c;将这些作为新的字段添加到原来的record中。这就涉及到本篇的主题&#xff1a;维表关联。 …

分布式锁方案分析:看图说话(图+文)

1 缘起 曾经在看分布式锁的时候&#xff0c;还是处于了解阶段&#xff0c; 回头总结时&#xff0c;发现有很多细节没有探究到&#xff0c; 本文以-看图说话的方式分析不同的分布式锁方案&#xff0c; 分布式锁需要保证&#xff1a; &#xff08;1&#xff09;互斥性&#xff1…

【从零开始学习深度学习】46. 目标检测中锚框的概念、计算方法、样本锚框标注方式及如何选取预测边界框

本文主要介绍目标检测中常用到的锚框相关概念、计算方式、样本标注及如何选取预测边界框并输出的相关内容。 目录1. 锚框介绍1.1 生成多个锚框2. 交并比--Jaccard系数3. 标注训练集的锚框4. 输出预测边界框---非极大值抑制方法总结1. 锚框介绍 在目标检测算法中通常会在输入图…

Linux常用命令——xhost命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) xhost 制哪些X客户端能够在X服务器上显示 补充说明 xhost命令是X服务器的访问控制工具&#xff0c;用来控制哪些X客户端能够在X服务器上显示。该命令必须从有显示连接的机器上运行。可以通过使用-host参数&…

​Topaz Photo AI 人工智能图像降噪锐化放大

Topaz Photo AI 是一款强大的基于人工智能技术的降噪、锐化及放大的工具。它不仅可以作为独立的软件使用&#xff0c;也可作为 Photoshop 的插件&#xff0c;以及能在 Lightroom Classic、Capture One 中调用。在 Lightroom Classic 中提供了两种工作流程&#xff0c;一种是直接…

while和do while的用法区别

前言在上一篇文章中&#xff0c;壹哥给大家讲解了循环的概念&#xff0c;并重点给大家讲解了for循环的使用。但在Java中&#xff0c;除了for循环之外&#xff0c;还有while、do-while、foreach等循环形式。今天小千就再用一篇文章&#xff0c;给大家讲解while循环的使用。本文带…

webshell 一句话木马

Webshell&#xff08;大马&#xff09;&#xff1a;webshell就是以asp、aspx、php、jsp或者cgi等网页形式存在的一种命令执行环境&#xff0c;也将其称为一种网页后门。黑客入侵一个网站后&#xff0c;通常会将 asp、aspx、php 或 jsp 后门文件与网站 web 服务器目录下正常的网…

基础算法(三)——二分查找

二分查找 介绍 一种复杂度为O(logn)O(logn)O(logn)级别的查找算法&#xff0c;需要被查找的数列具有某种单调性质&#xff0c;其本质其实是搜索一个符合check条件的区间。 二分分为两种&#xff1a; 整数二分浮点数二分 核心思想&#xff1a; 首先讨论整数二分&#xff1…

Django搭建个人博客Blog-Day02

配置文件的介绍&#xff1a;dev.py&#xff08;原来的setting.py文件&#xff09;# django的配置文件中的配置项是什么意思&#xff1f; import os # 导入模块# Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR os.path.dirname(os.path.d…

测牛学堂:软件测试学习之python调试和判断嵌套

python中调试代码 在python中&#xff0c;使用debug来调试代码。 我们使用debug的目的&#xff0c;就是可以查看代码的执行过程。 步骤&#xff1a; 1 打断点。打断点是开发的术语&#xff0c;类似于打标记&#xff0c;debug会让程序在你打断点的地方停止执行。 如果要查看代码…

RabbitMQ(六)消息应答和持久化

目录一、RabbitMQ 消息应答二、RabbitMQ 持久化1.交换机的持久化2.队列的持久化3.消息的持久化4.持久化问题官网地址&#xff1a;https://www.rabbitmq.com/ 下载地址&#xff1a;https://www.rabbitmq.com/download.html 一、RabbitMQ 消息应答 ​ 执行一个任务可能需要花费…

petitlyrics 歌词提取 有感

想做一下歌曲的时间轴&#xff0c;搜歌词搜到了这个网站。奇怪的是看前端代码和network监听请求都不能获得完整歌词。如 https://petitlyrics.com/lyrics/934773a. 歌词截图如下&#xff1a;b. 控制台查看前端代码只有部分歌词c. Network查看请求数据&#xff0c;发现是日语对应…

小白和设计师都能用的 3D 渲染神器 #Rotato

“我非常喜欢它。它为我节省了很多时间&#xff0c;而不必在 Adobe After Effects 等应用程序中挣扎。”——Dominik Sobe on Product HuntRotato 是什么&#xff1f;Rotato 是一款功能强大的 3D 样机渲染神器&#xff0c;支持 PNG 、JPG 、 avi、mov 、mp4 等多种格式。不仅能…

10分钟在 Rainbond 上部署 mall 电商项目

很多小伙伴在学习 mall 电商项目时&#xff0c;都会在部署上折腾许久&#xff0c;虽然目前已经提供了很多种部署方式&#xff0c;比如 在 Linux 上部署 mall 、使用 Docker 或 DockerCompose 部署 mall &#xff0c;但对于正在学习的我们都显得比较复杂&#xff0c;需要理解并学…

Vue.js组件编程的知识要点

在C/S编程中&#xff0c;对程序员来说&#xff0c;组件编程是一个不能忽视或者越过的技术能力&#xff0c;特别是自定义的组件编程以及构建基础组件库。虽然组件编程不是必须的&#xff0c;全部使用系统或者别人的组件&#xff08;控件&#xff09;也可以完成系统的开发&#x…

使用Python根据原始Excel表格批量生成目标Excel表格

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤亭台六七座&#xff0c;八九十枝花。大家好&#xff0c;我是Python进阶者。一、前言前几天在帮助粉丝解决问题的时候&#xff0c;遇到一个简单的小需求&#…

程序员如何通过兼职赚钱?有哪些渠道?

程序员的工资是没有网上说的那么夸张。 就我自己来说&#xff0c;在刚刚工作的那几年&#xff0c;月薪没有超过1万块钱。但是刚刚来到大城市&#xff0c;这点工资连我交房租都不够&#xff0c;生存都成了问题。于是我开始考虑进行兼职&#xff0c;虽然在最开始的几个月也只能有…

(Week 11)综合复习(C++,图论,动态规划,搜索)

目录汤姆斯的天堂梦&#xff08;C&#xff0c;Dijkstra&#xff09;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示解题思路&#xff1a;[蓝桥杯 2022 国 A] 环境治理&#xff08;C&#xff0c;Floyd&#xff09;题目描述输入格式输出格式样例 #1样例输入 #1样例输…

工控安全—工控常见协议识别

文章目录一、Nmap常见参数介绍二、工控常见协议识别三、工控设备指纹识别3.1 S73.2 Modbus3.3 IEC 60870-5-1043.4 DNP33.5 EtherNet/IP3.6 BACnet3.7 Tridium Niagara Fox3.8 Crimson V33.9 OMRON FINS3.10 PCWorx3.11 ProConOs3.12 MELSEC-Q四、测试一、Nmap常见参数介绍 -s…

STM32F411CE驱动Xbox摇杆

外观 引脚说明和原理 GND-GND 5V-5V VRX-ADC1通道1 VRX-ADC1通道2 SW独立按键-单片机的输入检测 本质上这个遥感就是集成了一个按键和两个电位器&#xff0c;遥感转动改变电位器也会转动&#xff0c;电压输出的值也就不一样&#xff0c;通过检测数值可自定义的做出判断&a…