Top-k

随机数组中最大K个数:

3, 2 ,1, 6, 4, 5 

最大的3个为:6,4,5

1、选择排序法。每次将待查询数组的最大一个找出,放入已查询数组中,一直找到K个为止。时间复杂度O(N*K)

2、堆排序法。使用小顶堆,存放最大K个元素。查询数组元素,如果堆中未满K个元素,则添加到堆中。如果堆里的元素满K个,且需查询的元素比堆的最小元素还大,则将最小的元素替换,更新小顶堆。如果堆里的元素满K个,但需查询的元素不比堆的最小元素大,则无需其他操作。时间复杂度O(N*log(K))

void shift(int b[], int i, int n)

{

    int k,tmp;



    k=i;



    if (((2*i+1) <n) && b[k]>b[2*i+1])

    {

        k=2*i+1;

    }

    if (2*i+2<n && b[k]>b[2*i+2])

    {

        k=2*i+2;

    }



    if (k!=i)

    {

        tmp = b[k];

        b[k] = b[i];

        b[i] = tmp;

        shift(b, k, n);

    }

    

}



int func14(int a[], int k, int n)

{

    int *b,j,tmp;



    b=(int* )malloc(sizeof(int)*k);

    memset(b, 0, sizeof(int)*k);



    j=0;



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

    {

        if (j<k)

        {

            b[j] = a[i];

            int l=j;

            while(l>0) //自底向上

            {    

                if (b[(l-1)/2] > b[l])

                {

                    tmp = b[(l-1)/2];

                    b[(l-1)/2] = b[l];

                    b[l]=tmp;

                }

                l = (l-1)/2;

            }

            j++;

        }

        else //j==k

        {

            if (b[0]<a[i])

            {

                b[0]=a[i];

                shift(b, 0, j); //自顶向下

            }

        }

    }

    

    printa(b, j);

    cout<<endl;

    

    return j;

}



//调用

int a[]= {3, 2 ,1, 6, 4, 5};

cout <<func14(a, 3, sizeof(a)/sizeof(int))<<endl;;

3、其他方法。编程之美中有。。。。

 

你可能感兴趣的:(top)