一、学前花絮
我们之前对算法的学习包括基础知识如数据结构及大致常用算法类型。又学习了贪心算法、回溯算法并结合实际情况进行示例。今天学习分治算法,简答说分治就是化繁为简的方法,是我们日常经常用到的思考、做事方式。
比如我们想成为python高手,这是一个很高的目标,那么在这个目标下我们就要细分去学习很多板块的内容,然后再把所学到的知识进行归并,坚持下去就有可能达到目标。
之前学过二分查找算法的朋友可能会问,二分发就是把一串元素分割开来进行处理,难道与分治相同?下面我们解释这个问题。
二、Python实现分治算法
2.1 一个常见的误解
“分治算法不就是把大问题分成小问题解决吗?那二分查找和归并排序不都是分治算法吗?”
这个理解对了一半,但漏掉了关键区别。
让我用一个实际问题来说明:

输出如下:

运行这个程序,输出是错误的。为什么?
因为二分查找有一个致命前提:数组必须已排序。
2.2 二分查找:只能在"已排序"的舞台上跳舞
二分查找的核心思想:
1. 找到数组中间元素
2. 比较中间元素与目标
3. 如果相等 → 找到
4. 如果目标更大 → 在右半部分继续查找
5. 如果目标更小 → 在左半部分继续查找
正确的二分查找实现:

调用该函数:

输出结果:

关键点:二分查找本身不负责排序,它假设数据已经排好序了。
2.3 归并排序:分治算法的排序典范
归并排序的核心思想:
1. 把数组分成两半
2. 递归排序每一半
3. 合并两个有序的半边
归并排序完整实现:
输出结果:

以上就是程序执行过程,我们详细列出来分解与合并的过程,便于理解分治的算法思想。
2.4 二分查找 vs 归并排序:全面对比
对比维度 | 二分查找 | 归并排序 |
目标 | 在有序数据中查找 | 对无序数据进行排序 |
前提条件 | 数据必须已排序 | 无前提条件 |
时间复杂度 | O(log n)查找 | O(n log n)排序 |
空间复杂度 | O(1)或O(log n) | O(n)额外空间 |
是否改变原数组 | 否 | 是 |
适用场景 | 频繁查找操作 | 一次性排序需求 |
2.5 实际工作流程:它们如何配合
在真实项目中,二分查找和归并排序经常配合使用:
输出结果:

2.6 分治算法的本质:一个通用框架
分治算法其实是一个通用的问题解决框架:

不同的分治算法,只是填充了这个模板的不同部分:
2.7 什么时候用哪个?
代码示例:智能选择器

程序调用:

输出结果:

2.8 以上内容的总结
l二分查找是搜索算法,要求数据已排序
l归并排序是排序算法,不要求数据已排序
l它们都使用了分治思想,但解决不同问题
l在实际项目中,经常先排序再查找
核心区别在于:
l二分查找是"在有序数组中快速定位"
l归并排序是"把无序数组变成有序"
三、小结
今天的文章是学习分治算法,通过二分查找和归并排序的示例,让我更深刻理解分治算法的核心。应该说,分治算法的核心不是具体的算法,而是一种思想,它是"分解-解决-合并"这个通用的问题解决策略。
让我们保持学习的热情,2026年一马当先!