算法第二章实践作业
首先选一个基准pivot,做划分,划分完后,pivot 落在位置p。然后比较和k和p,如果p == k那就找到了,直接返回;如果p > k那么目标在左半边,如果p<k目标就在右半边,去右边找,但 k 要减去左边元素个数,然后就这样不断缩小范围。
QuickSelect(A, left, right, k):
p = Partition(A, left, right)
rank = p - left + 1
if k == rank:
return A[p]
else if k < rank:
return QuickSelect(A, left, p - 1, k)
else:
return QuickSelect(A, p + 1, right, k - rank)
最好情况是T(n)=T(n/2)+O(n),时间复杂度是O(n)。最坏情况是T(n)=T(n-1)+O(n),时间复杂度是O(n²)
我对于分治法的体会,分治法的核心是把大问题拆成若干同类小问题,递归求解,再合并结果。适用条件于子问题独立,规模缩小后可直接求解,解能有效合并的。但是合并代价过大时,分治优势会减弱。我的体会到分治提供了一种处理复杂问题的通用思路,先找可递归分解的结构,再设计从小结果到大结果的整合路径。
浙公网安备 33010602011771号