分治算法的基本原理
分治算法(Divide and Conquer)是一种通过将问题分解为更小的子问题来解决复杂问题的算法设计范式。其核心思想是将原问题划分为若干个规模较小的相似子问题,递归地解决这些子问题,再将子问题的解合并为原问题的解。分治算法通常包含三个步骤:分解(Divide)、解决(Conquer)和合并(Combine)。
分治算法的适用条件包括:
- 问题可以分解为若干个规模较小的相同子问题。
- 子问题的解可以合并为原问题的解。
- 子问题之间相互独立,没有重叠(若存在重叠,通常采用动态规划更高效)。
经典分治算法示例
归并排序
归并排序是分治算法的典型应用之一。其基本思想是将待排序数组分成两半,递归地对两半进行排序,最后将两个有序数组合并为一个有序数组。
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]
merge_sort(left_half)
merge_sort(right_half)
i = j = k = 0
while i < len(left_half) and j < len(right_half):
if left_half[i] < right_half[j]:
arr[k] = left_half[i]
i += 1
else:
arr[k] = right_half[j]
j += 1
k += 1
while i < len(left_half):
arr[k] = left_half[i]
i += 1
k += 1
while j < len(right_half):
arr[k] = right_half[j]
j += 1
k += 1
return arr
快速排序
快速排序也是一种基于分治的排序算法。它通过选择一个“基准”元素,将数组分为两部分,一部分小于基准,另一部分大于基准,然后递归地对两部分进行排序。
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2
986

被折叠的 条评论
为什么被折叠?



