请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

贴一段100万前100的代码

//100万个数取出前100名。n是100万,m是100。
template <typename T>
void heapSort(T arr[], int n, int m)
{
    for (int i = (m-1)/2; i >=0; i--)
    {
        __shiftDown(arr , m , i);
    }
    //只维护前100名
    for (int i = m; i < n; ++i)
    {
        if (arr[m] > arr[0])
        {
            swap(arr[m], arr[0]);
            __shiftDown(arr , m , 0);
        }
    }
    //排序
    for (int i = 0; i < m; ++i)
    {
        swap(arr[0] , arr[m-i]);
        __shiftDown(arr, m-i , 0);
    }

}


正在回答

2回答

liuyubobobo 2017-04-04 02:09:11

其实只需要做一个大小为100的堆就可以哦。比如要找n=100万个元素的最大的m=100个元素,只需要维护一个大小为100的最小堆。将100万个元素的前100个元素塞进堆里之后,后面的元素都和最小堆里的最小元素作比较,如果比当前最小堆的最小元素还要小,直接扔掉;否则,将最小堆里的最小元素扔掉,新元素进堆。这样操作后,最后最小堆里剩下的100个元素,就是这100万个元素里最大的100个元素。时间复杂度是:O(nlogm) :-)

6 回复 有任何疑惑可以回复我~
  • 提问者 慕粉3197494 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2017-04-04 17:12:12
  • lobby #2
    他的代码不就是一个大小为100的堆吗
    回复 有任何疑惑可以回复我~ 2020-03-29 13:32:18
lobby 2020-03-29 13:41:22

//只维护前100名

    for (int i = m; i < n; ++i)

    {

        if (arr[m] > arr[0])

        {

            swap(arr[m], arr[0]);

            __shiftDown(arr , m , 0);

        }

    }


这段写的有问题吧

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信