第二章作业

1、function quickSelect(arr, k):
if len(arr) == 1:
return arr[0]
pivot = 选择基准元素(如arr[len(arr)//2])
left = [x for x in arr if x < pivot]
mid = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
if k <= len(left):
return quickSelect(left, k)
elif k <= len(left) + len(mid):
return mid[0]
else:
return quickSelect(right, k - len(left) - len(mid))
2、时间复杂度分析
最好情况 :O(n),每次划分都将数组分成大小近似相等的两部分,递归深度为O(logn),每次划分处理O(n)个元素,总体为O(n)。
最坏情况:O(n2),每次划分都极端不平衡(如基准是数组的最大或最小值),递归深度为O(n),每次处理O(n)个元素,总体为O(n2)。
3、对分治法的体会和思考
核心思想:分治法的核心是 “分而治之”,将一个复杂问题分解为若干个结构相似的子问题,递归地解决子问题后,再将子问题的解合并得到原问题的解。
适用场景:适用于问题可分解、子问题解可合并、子问题相互独立的场景,如排序(快速排序、归并排序)、查找(快速选择、二分查找)等问题。
优势与局限:优势是能将复杂问题拆解,降低解决难度;局限是若分解或合并的成本过高,或子问题划分不平衡,可能导致时间复杂度恶化,因此在使用时需关注划分策略(如快速选择中基准的选择)以优化性能。
与其他算法思想的关联:分治法与递归紧密结合,也可与贪心、动态规划等思想结合解决更复杂的问题,是算法设计中非常基础且重要的思想之一。

posted @ 2025-11-01 13:37  想个好点子  阅读(3)  评论(0)    收藏  举报