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、其他方法。编程之美中有。。。。

 

posted @ 2013-03-25 11:03  legendmaner  阅读(185)  评论(0编辑  收藏  举报