第二次作业

1.function findKthSmallest(arr, left, right, k):
if left == right: // 子数组只有一个元素时,直接返回
return arr[left]
// 分区操作:返回基准元素最终位置的索引
pivotIndex = partition(arr, left, right)
// 计算基准元素是当前子数组中的第几个小元素(从1开始计数)
currentRank = pivotIndex - left + 1
if currentRank == k: // 找到第k小元素
return arr[pivotIndex]
else if k < currentRank: // 第k小元素在左子数组中
return findKthSmallest(arr, left, pivotIndex - 1, k)
else: // 第k小元素在右子数组中,调整k值
return findKthSmallest(arr, pivotIndex + 1, right, k - currentRank)
// 分区辅助函数:以基准元素划分数组,返回基准最终位置
function partition(arr, left, right):
// 选择最右侧元素作为基准
pivot = arr[right]
// i记录小于基准的元素的边界(初始为左边界左侧)
i = left - 1
// 遍历除基准外的元素,将小于基准的元素移到左侧
for j from left to right - 1:
if arr[j] <= pivot:
i = i + 1
swap(arr[i], arr[j])
// 将基准元素放到最终位置(i+1)
swap(arr[i + 1], arr[right])
return i + 1 // 返回基准位置
2.时间复杂度分析
最好时间复杂度:每次分区后基准恰好将数组均匀划分,即左右子数组规模大致相等。此时递归深度为对数级
O(logn),每层分区操作耗时O(n),总时间复杂度为O(n)。
最坏时间复杂度:每次分区极不平衡,如基准始终为最大或最小元素,导致每次递归仅减少一个元素。递归深度达O(n),每层分区耗时O(n),总时间复杂度为O(n^2)
3.对分治法的体会和思考
优势:分治法将一个复杂的问题分解为多个规模较小的子问题,这些子问题与原问题具有相同的结构,通过递归求解子问题并合并结果来解决原问题。它能够有效地降低问题的复杂度,在很多情况下能够提高算法的效率。
适用场景:适用于问题可以分解为多个独立的子问题,且子问题的解可以合并成原问题的解的情况。
挑战:分治法通常伴随着递归调用,这可能会带来额外的空间开销。此外,如何合理地划分问题是分治法的关键,如果划分不合理,可能导致算法的时间复杂度恶化。在实际应用中,需要根据具体问题的特点来选择合适的划分策略,以达到较好的时间和空间性能。

posted @ 2025-11-02 18:08  36zjy  阅读(8)  评论(0)    收藏  举报