一题多解(五) —— topK(数组中第 k 大/小的数)

根据对称性,第 k 大和第 k 小,在实现上,是一致的,我们就以第 k 小为例,进行说明:

法 1

直接排序(sort(A, A+N)),当使用一般时间复杂度的排序算法时,其时间复杂度为 O(N2)

法 2

先将 k 个元素读入一个数组并将其排序,sort(A, A+k),则这些元素的最大值在第 k 个位置上。我们一个一个处理剩余的元素,当一个元素开始被处理时,它先于数组中第 k 个元素比较,

  • 如果该元素大,不做任何处理,遍历下一个元素;
  • 如果该元素小,则将该元素插入在前面合适的位置;

代码逻辑可参考 插入排序(insertion sort)

此时的时间复杂度为:O(k2+(Nk)k)=O(Nk)

法 3:借助数据结构

优先队列,DeleteMin 执行 k-1 次,

法 4:借助快排的 partition 函数

根据 partition 函数返回值与 k 的关系,然后继续进行 partition:

int partition(int*A, int N, int s, int e) {
    if (!A || N <= 0 || s < 0 || e >= N)
        throw exception("");
    int toSwap = s - 1;
                            // 以最后一个元素作为 pivot,然后进行
    for (int i = s; i < e; ++i) {
        if (A[i] < A[e]) {
            ++toSwap;
            if (toSwap != i) {
                swap(A[toSwap], A[i]);
            }
        }
    }
    ++toSwap;
    swap(A[toSwap], A[e]);
}

int topK (int*A, int N, int k) {
    int p = partition(A, N, 0, N-1);
    while (p != k-1) {
        p < k-1 ? p = partition(A, N, p+1, N-1) : p = partition(A, N, 0, p-1);
    }
    return A[p];
}

转载于:https://www.cnblogs.com/mtcnn/p/9423549.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值