434
社区成员
发帖
与我相关
我的任务
分享在数组(任意)取一个基准值temp,通过头尾双指针向内遍历把数组分割成两部分,a[l...j]和a[j+1...r]。a[l...j]中的元素小于v,a[j+1...r]中元素大于v。j>=k时递归到数组a[l...j]中搜索第k小的数。否则递归到数组a[j+1...r]中搜索第k-(j-l+1)小的数。
在最好的情况下,每次选择的基准都能将数组均匀划分成两部分,这样递归树的深度为O(log n),每层处理的时间为O(n)(因为需要遍历数组进行划分),但由于是递归调用,所以总的时间复杂度为O(n log n)。
在最坏的情况下,每次选择的基准都是数组中的最小或最大元素,导致递归树退化为链表形式,递归深度为O(n),每层处理的时间仍为O(n),因此总的时间复杂度为O(n^2)。
分治法是一种算法设计范式,它将一个大问题分解为几个小问题来解决,然后将这些小问题的解组合起来得到原问题的解。
分治法适用于许多不同类型的问题,包括但不限于排序、搜索、最大/最小值计算、动态规划等。
在分治法中,除了分解和解决子问题外,如何有效地合并这些子问题的解也非常关键。这一步骤往往决定了整个算法的性能。
由于分治法通常涉及递归调用,因此它可能会消耗较多的内存空间(尤其是对于深度很大的递归)。在实际应用中需要考虑这一点,可能需要使用迭代或其他方法来优化空间复杂度。