首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

O(n)算法查找数字集合的中位数

要使用O(n)算法查找数字集合的中位数,您可以使用线性时间选择算法(Linear Time Selection Algorithm),也称为快速选择算法(Quickselect Algorithm)。以下是一个示例的快速选择算法实现:

代码语言:javascript
复制
def find_median(nums):
    n = len(nums)
    k = (n + 1) // 2  # 中位数的位置

    def partition(left, right):
        pivot = nums[right]  # 选择最右边的元素作为枢轴
        i = left - 1

        for j in range(left, right):
            if nums[j] <= pivot:
                i += 1
                nums[i], nums[j] = nums[j], nums[i]

        nums[i + 1], nums[right] = nums[right], nums[i + 1]
        return i + 1

    def quick_select(left, right):
        if left == right:
            return nums[left]

        pivot_index = partition(left, right)

        if k == pivot_index + 1:
            return nums[pivot_index]
        elif k < pivot_index + 1:
            return quick_select(left, pivot_index - 1)
        else:
            return quick_select(pivot_index + 1, right)

    return quick_select(0, n - 1)

在上面的示例中,find_median函数接受一个数字集合nums作为输入,并使用快速选择算法来查找中位数。算法的核心是通过选择枢轴元素将集合划分为两个部分,然后根据中位数的位置递归地在其中一个部分中继续查找,直到找到中位数。

要使用该算法,只需调用find_median函数并传入数字集合。它将返回集合的中位数。

请注意,快速选择算法的平均时间复杂度为O(n),但最坏情况下的时间复杂度为O(n^2)。然而,在实践中,它通常表现良好,并且在大多数情况下能够以线性时间找到中位数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 算法导论第九章中位数和顺序统计量(选择问题)

    本章如果要归结成一个问题的话,可以归结为选择问题,比如要从一堆数中选择最大的数,或最小的数,或第几小/大的数等, 这样的问题看似很简单,似乎没有什么可研究的必要,因为我们已经知道了排序算法,运用排序+索引的方式不就轻松搞定了?但细想,排序所带来的时间复杂度是不是让这个问题无形之中变得糟糕。那算法研究不就是要尽可能避免一个问题高复杂度地解决,让那些不敢肯定有无最优解的问题变得不再怀疑,这也是算法研究者所追求的一种极致哲学。既然排序让这个问题解决的性能无法确定,那我们就抛开排序,独立研究问题本身,看有没有确

    07
    领券