TopN算法

TopN算法:从已经存在的数组中,找出最大(或最小)的前n个元素。

算法(以找最大的n个元素为例):
1. 取出数组的前n个元素,创建长度为n的小根堆;
2. 从n开始循环数组的剩余元素,如果当前元素比小根堆的根节点大,则将当前元素设置成小根堆的根节点,并通过调整让堆保持小根堆;
3. 循环完成后,小根堆中的所有元素就是需要找的最大的n个元素;
4. 根据需要对小根堆中的所有元素继续利用堆排序算法进行排序。

算法实现的C++版本如下:

void sift(int *pData, int k, int m)
{
    int i = k, j = k * 2;
    while (j <= m) {
        if (j < m && pData[j] > pData[j + 1]) ++j;
        if (pData[i] < pData[j]) break;
        else
        {
            pData[0] = pData[i];
            pData[i] = pData[j];
            pData[j] = pData[0];
            i = j;
            j = i * 2;
        }
    }
}

void TopN(int *pData, int len, int *pTop, int n, bool sortFlag) // pData[1, len], pTop[1, n]
{
    memcpy(pTop, pData, (n + 1) * sizeof(int));
    for (int i = n / 2; i >= 1; --i)
        sift(pTop, i, n);

    for (int i = n + 1; i <= len; ++i)
    {
        if (pData[i] > pTop[1])
        {
            pTop[1] = pData[i];
            sift(pTop, 1, n);
        }
    }

    if (sortFlag)
    {
        for (int i = 1; i < n; ++i)
        {
            pTop[0] = pTop[1];
            pTop[1] = pTop[n - i + 1];
            pTop[n - i + 1] = pTop[0];
            sift(pTop, 1, n - i);
        }
    }
}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值