查找最小的k个元素

题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。


如果这些数字,是放在数组中给出的话,直接建立小顶堆,然后输出前k个就好了。 时间复杂度 kLog(n),建立堆log(n),共建k次

void heapAdjust(int* a,int s, int m)
{
    int temp = a[s];
    for(int j=2*s+1; j<=m; j=j*2+1)
    {

        if(j<m && a[j] > a[j+1]) 
            j++;
        if(temp<=a[j])
            break;

        a[s] = a[j];
        s = j;
    }
    a[s] = temp;
}


int main()
{
    int a[] = {49,38,65,97,76,13,27,49};
    int length = sizeof(a)/sizeof(a[0]);
    for(int i= (length-1)/2 ; i>=0; i--)
        heapAdjust(a,i,length-1);
    int k=3;
    for(int i = length-1,j=0; i>0&&j<k; i--,j++)
    {
        int temp = a[0];
        a[0] = a[i];
        a[i] = temp;
        heapAdjust(a,0,i-1);
        cout<<temp<<endl;
    }
}
posted @ 2012-10-25 22:31  三更_雨  阅读(159)  评论(0编辑  收藏  举报