python数据结构与算法-13_高级排序算法-分治法

分治法 (Divide and Conquer)

很多有用的算法结构上是递归的,为了解决一个特定问题,算法一次或者多次递归调用其自身以解决若干子问题。
这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但是类似于原问题的子问题,递归求解这些子问题,
然后再合并这些问题的解来建立原问题的解。

分治法在每层递归时有三个步骤:

  • 分解原问题为若干子问题,这些子问题是原问题的规模最小的实例
  • 解决这些子问题,递归地求解这些子问题。当子问题的规模足够小,就可以直接求解
  • 合并这些子问题的解成原问题的解

归并排序

现在我们就来看下归并排序是是如何利用分治法解决问题的。

  • 分解:将待排序的 n 个元素分成各包含 n/2 个元素的子序列
  • 解决:使用归并排序递归排序两个子序列
  • 合并:合并两个已经排序的子序列以产生已排序的答案

考虑我们排序这个数组:[10,23,51,18,4,31,13,5] ,我们递归地将数组进行分解

在这里插入图片描述

当数组被完全分隔成只有单个元素的数组时,我们需要把它们合并回去,每次两两合并成一个有序的序列。

在这里插入图片描述

用递归代码来描述这个问题:

def merge_sort(seq):if len(seq) <= 1:   # 只有一个元素是递归出口return seqelse:mid = int(len(seq)/2)left_half = merge_sort(seq[:mid])right_half = merge_sort(seq[mid:])# 合并两个有序的数组new_seq = merge_sorted_list(left_half, right_half)return new_seq

注意我们这里有一个函数没实现,就是如何合并两个有序数组 merge_sorted_list。其实你在纸上画一画,
合并两个有序数组并不难实现。

在这里插入图片描述

在这里插入图片描述

def merge_sorted_list(sorted_a, sorted_b):""" 合并两个有序序列,返回一个新的有序序列:param sorted_a::param sorted_b:"""length_a, length_b = len(sorted_a), len(sorted_b)a = b = 0new_sorted_seq = list()while a < length_a and b < length_b:if sorted_a[a] < sorted_b[b]:new_sorted_seq.append(sorted_a[a])a += 1else:new_sorted_seq.append(sorted_b[b])b += 1# 最后别忘记把多余的都放到有序数组里if a < length_a:new_sorted_seq.extend(sorted_a[a:])else:new_sorted_seq.extend(sorted_b[b:])return new_sorted_seq

这样就实现了归并排序,并且你会发现它返回一个新的数组而不是修改原有数组。

时间复杂度

我们来简单看下它归并排序的时间复杂度,假设排序 n 个数字时间复杂度是 T(n),这里为了方便假设 n 是 2 的幂

\begin{align}
T(n)= \begin{cases} c, & \text {if n n n = 1} \ 2T(n/2)+cn, & \text{if n n n > 1} \end{cases}
\end{align}

在这里插入图片描述

总的代价是 c n l g ( n ) + c n cnlg(n)+cn cnlg(n)+cn ,忽略常数项可以认为是 O(nlg(n))。如果这个图看不懂,我们自己求解下也不难,首先我们简化一下,
把常数系数当成 1,得到以下递归式:

\begin{align}
T(n)= \begin{cases} 1, & \text {if n n n = 1} \ 2T(n/2)+n, & \text{if n n n > 1} \end{cases}
\end{align}

在这里插入图片描述

思考题

  • 请你完成归并排序的单元测试
  • 这里实现的归并排序是 inplace 的吗?
  • 归并排序是稳定的吗?稳定指的是排序前后相同大小的数字依然保持相对顺序。

延伸阅读

  • 《算法导论》第 2 章和第 4 章,你需要了解下『主定理』,以及如何求解形如 T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b) + f(n) T(n)=aT(n/b)+f(n) 的递归式复杂度
  • 了解算法导论上递归式的三种求解方法:代入法,递归树法,主方法

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

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

相关文章

#include <tf/tf.h>这个头文件有哪些主要的功能?

在 ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;#include <tf/tf.h> 是一个非常重要的头文件&#xff0c;它属于 tf 转换库&#xff0c;主要用于处理和转换不同坐标系之间的位置和方向。以下是 tf/tf.h 头文件的一些主要功能&#xff1a; 坐标系转换…

SOEM主站开发篇(1):移植SOEM主站到Linux开发板

0 工具准备 1.SOEM-1.4.0源码(官网:http://openethercatsociety.github.io/) 2.EtherCAT从站(本文使用DE3E-556步进电机驱动器) 3.Linux开发板(本文为正点原子I.MX6U ALPHA开发板) 4.交叉编译工具(arm-linux-gnueabihf-gcc) 5.cmake(版本不得低于3.9,本文为3.9.2&a…

vue3+element Plus中使用日期格式化库day.js

element Plus中使用日期格式化库day.js,无需再单独引入day.js Element-plus (opens new window)组件库默认支持 dayjs 进行日期时间处理&#xff0c;所以可以直接导入使用&#xff0c;相关 Date Picker (opens new window)组件介绍。 day.js官网链接dayjs.fenxianglu.cn/ El…

sap系统连接其它系统

本文来自博客园&#xff0c;作者&#xff1a;Lovemywx2&#xff0c;转载请注明原文链接&#xff1a;https://www.cnblogs.com/1187163927ch/p/8669859.html JAVA连接ORACLE数据库 1&#xff0c;首先需要在Oracle安装完成之后新建一个用户 --新建用户 create user chenh iden…

C 标准库 - <math.h>和<setjmp.h>详解

目录 简介 库宏 库函数 实例 简介 库变量 库函数 实例 <math.h> 简介 <math.h> 是 C 标准库中的一个头文件&#xff0c;主要提供了数学运算相关的函数和宏定义。它允许您在 C 程序中执行各种常见的数学计算&#xff0c;如三角函数、对数、指数、幂运算等。…

两个跨域页面通信(iframe) (postMessage)

两个跨域页面通信&#xff08;iframe&#xff09; (postMessage) 在浏览器的安全模型中&#xff0c;JavaScript通常只能访问与当前网页具有相同源&#xff08;协议、域名、端口&#xff09;的 localStorage 数据&#xff0c; 这意味着&#xff0c;如果你的网页想要访问其他网站…

设计模式 之单例模式

单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供全局访问点&#xff0c;使得该实例可以在程序的任何地方被访问。单例模式经常用于管理共享资源或限制对象创建数量的情况下。 实现一个单例模式需要注意以下几个关键点&#xff1a; 构造…

呼叫中心自建好还是云外呼好用?

传统的呼叫中心在科技的发展下已经被不适用了&#xff0c;都开始使用起智能化的呼叫中心&#xff0c;一个是自建式呼叫中心&#xff0c;一个是云外呼系统。那自建式呼叫中心与云外呼系统的区别有哪些呢&#xff1f; 1、企业自建呼叫中心 劣势 系统维护更新难&#xff1a;自建…

C语言第二十弹--求最大公因数

求最大公因数 最大公因数&#xff1a;也称最大公约数、最大公因子&#xff0c;指两个或多个整数共有约数中最大的一个。 一、穷举法 思路&#xff1a;找到两个数之间的最少值 使用第三接收最小值&#xff0c;然后通过判断两者%n是否同时等于0&#xff0c;同时为0证明就是两者…

安装vue vue-server-renderer报错

安装vue和vue-server-renderer时报错可能有多种原因&#xff0c;以下是一些可能的解决方法&#xff1a; 确认安装了正确的版本&#xff1a;检查您需要安装的Vue版本和Vue-Server-Renderer版本是否匹配&#xff0c;可以在官方文档中查看。 检查网络连接&#xff1a;请确保您的网…

Proxifier联动BurpSuite抓取小程序

直接上软件包 Proxifier安装包https://pan.quark.cn/s/7fb9ad6deb7cProxifier配置文件https://pan.quark.cn/s/049c5f21c97e 无话可说直接操作 1、安装Proxifier步骤可以省略..... 2、将下面文件导入到Proxifier中 3、左上角文件-导入配置文件&#xff08;因为我已经导入过…

java金额大小写转换/金额转大写/数字金额转换为中文大写金额

文章目录 处理金额问题时&#xff0c;经常需要将数字金额转换为中文大写金额&#xff0c;以下为代码及测试用例。 代码 package com.common.utils.money;import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomUtils; import org.apache…

将bitmap转化为1位黑白像素图像(仅保留黑色,其它颜色会删除)

/// <summary> /// 将bitmap转化为1位黑白像素图像(仅保留黑色&#xff0c;其它颜色会删除) /// </summary> /// <param name"bmp"></param> /// <returns></returns> public static Bitmap To1Bit(Bitmap bmp) {Bitmap tmp bm…

C 语言 typedef 关键字

C 语言 typedef 关键字 C 语言提供了 typedef 关键字&#xff0c;您可以使用它来为类型取一个新的有意义的名字。也就是用于重新定义已经存在的变量的名称。 typedef 的语法 typedef <existing_name> <alias_name>在以上语法中&#xff0c;“ **existing_name”…

url最大长度

https://blog.csdn.net/weixin_38673922/article/details/130932457 对于前端作为分享页&#xff0c;或者跳转新页面时&#xff0c;或者做hrbrid 通信&#xff0c;需要用到一系列的参数来处理相对的业务逻辑&#xff0c;那么具体url可以携带多少参数合适&#xff0c;从网上搜索…

【CodeTop】TOP 100 刷题 11-20

文章目录 11. 二叉树的层序遍历题目描述代码与解题思路 12. 搜索旋转排序数组题目描述代码与解题思路 13. 买卖股票的最佳时机题目描述代码和解题思路 14. 岛屿数量题目描述代码与解题思路 15. 环形链表题目描述代码与解题思路 16. 有效的括号题目描述代码与解题思路 17. 合并两…

使用 millis() 函数作为延迟的替代方法(电位器控制延迟时间)

接线图&#xff1a; 代码&#xff1a; unsigned long currentMillis 0; unsigned long previousMillis_LED1 0; unsigned long LED1_delay0; unsigned long previousMillis_LED2 0; unsigned long LED2_delay0; #define LED1 3 #define LED2 9 #define P1 A2 …

动态规划求数组中相邻两数的最小差值( 即相差的绝对值 ) java 实现

算法的核心是&#xff1a;计算当前数和前一个数的差值,用该差值和以前最小的连续数的差值作比较&#xff1b;如果当前的差值更小&#xff0c;则发现了更小的连续数的差值&#xff1b;如果当前的差值更大&#xff0c;则沿用以前的最小连续数差值作为新的最小连续数差值。 MinDif…

python写文件

output_file open(E:/XD_transfer/代码/CNN_new/try.csv, w) output_file.write(Sample, \n) for j in range(5):output_file.write(str(j) \n)

2023亚太杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…