作业2
// 找第k小的数的分治算法
function findKthSmallest(arr, left, right, k):
if left == right:
return arr[left]
pivot = arr[right]
i = left - 1
for j from left to right - 1:
if arr[j] <= pivot:
i = i + 1
swap(arr[i], arr[j])
swap(arr[i+1], arr[right])
pivotPos = i + 1 // 基准值的最终索引
leftCount = pivotPos - left
if k <= leftCount:
return findKthSmallest(arr, left, pivotPos - 1, k)
elif k == leftCount + 1:
return arr[pivotPos]
else:
return findKthSmallest(arr, pivotPos + 1, right, k - leftCount - 1)
最好时间复杂度:O (n),每次选择的基准值都能将数组拆分为 “左右子数组长度相差不超过 1” 的平衡分区,比如用 “三数取中”(选左、中、右三个元素的中位数作为基准)可避免极端情况。推导过程:每层操作(分区)需遍历当前区间所有元素,时间为 O (n);拆分后仅需处理一个子数组,且子数组长度约为原区间的 1/2,递归层数为 O (log n)。但实际总时间需用 “望远镜求和” 计算:第 1 层处理 n 个元素,第 2 层处理 n/2 个,第 3 层处理 n/4 个…… 最后一层处理 1 个,总时间为 n + n/2 + n/4 + ... + 1,等比数列求和结果为 2n-1,整体复杂度为 O (n)。
最坏时间复杂度:O (n²),每次选择的基准值都是当前区间的 “最值”,比如始终选最后一个元素且数组已升序 / 降序排列,会导致分区极端不平衡 ——“小于基准区” 有 0 个元素,“大于基准区” 有 n-1 个元素。
分治法不只是一种算法思想,更是解决复杂问题的思维方式:面对庞大复杂的问题,先拆为可控的小问题,再聚焦核心子问题求解,最终高效得答案 —— 这种思维在工程开发(如分布式系统拆分、大型项目模块设计)中也同样适用。

浙公网安备 33010602011771号