TOP k算法

面试题:算法题
10万次搜索,两两比较找出top100,然后比较次数总次数不超过20万次,不能碎片化申请空间,一次性申请一个大数组作为储存。
下午:索贝科技有限公司

    #include <iostream>
    using namespace std;


    // 构建大根堆,其中a是第一个非叶子节点,z是节点个数
    void HeapAdjust(int A[], int a, int z)
    {
        // 重建最大堆,i是父节点,j是左子节点
        for(int i = a, j = 2 * i; j <= z; i = j, j = 2 * i)
        {
            // 取i的左右子节点中较大的子节点
            if(j < z && A[j + 1] > A[j])
                j++;

            if(A[i] < A[j])
                swap(A[i], A[j]);
            else
                break;
        }
    }

    // 从右到做,从下到上
    void HeapSort(int A[], int n)
    {
        // 第一步:建立大根堆(i是第一个非叶子节点,n是节点个数)
        for(int i = n / 2; i >= 1; i--)
        {
            HeapAdjust(A, i, n);
        }

        for(int i = n; i >= 1; i--)
        {
            // 第二步:交换堆元素(堆首和堆尾)
            swap(A[1], A[i]);

            // 第三步:重建大根堆
            HeapAdjust(A, 1, i - 1);
        }
    }






    void TopK(int n,int top)
    {
        int * arr = (int *)malloc(sizeof(arr)*n);
        if(arr==NULL)
        {
            return ;
        }
        for(int i = 1; i <=n; i++)
        {
            arr[i] = rand();
        }
        HeapSort(arr, n);
        for(int i = 1;i<=top;i++)
        {
            cout<<arr[i]<<endl;
        }

        if(arr!=NULL)
        {
            arr=NULL;
            free(arr);
        }



    }
    int main()
    {



        TopK(10000,30);


        system("pause");
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值