第二章作业
一、伪代码
function partition(a[], left, right):
pivot = a[left]
i = left, j = right
while i < j:
while i < j 且 a[j] > pivot: j--
if i < j: a[i++] = a[j]
while i < j 且 a[i] ≤ pivot: i++
if i < j: a[j--] = a[i]
a[i] = pivot
return i
function find(a[], left, right, k):
pos = partition(a, left, right)
currentRank = pos - left + 1
if currentRank == k:
return a[pos]
elif currentRank > k:
return find(a, left, pos - 1, k)
else:
return find(a, pos + 1, right, k - currentRank)
二、时间复杂度分析
1.最好时间复杂度:O(n)
当每次划分都能将数组分成规模接近的两部分时,
O(n)+O(2/n)+O(4/n)+⋯=O(n)
2. 最坏时间复杂度:O(n^2)
当每次划分都将数组分成极不均衡的两部分时,
O(n)+O(n−1)+O(n−2)+⋯=O(n^2)
三、对分治法的思考
分治法将复杂问题拆解为相似的子问题,通过递归求解子问题,最终合并结果,适用于 “问题可分解为相似子问题,且子问题的解可高效合并” 的场景。经典的快速排序、归并排序、大数乘法等问题,都是分治法的典型应用。在实际开发中,面对大规模数据的排序、查找、矩阵运算等需求,分治法往往是性能优化的关键思路。
浙公网安备 33010602011771号