find the N max numbers from an array

//find the N max numbers from an array
#include <iostream>

using namespace std;

#if 0
void swap(int &a, int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

int partition(int *data, int beg, int end)
{
    int pos = beg;
    int i = beg;
    while(i < end)
    {
        if(data[i] >= data[end])
        {
            swap(data[i], data[pos]);
            pos++;
            continue;
        }
        i++;
    }

    swap(data[pos], data[end]);

    return pos;
}
//qsort() to do partition, until find the min of N max number
int findKNumbers(int *data, int beg, int end, int k)
{
    int pos = partition(data, beg, end);
    int len = pos - beg + 1;

    if(len == k)
        return pos;
    else if(len < k)
        return findKNumbers(data, pos+1, end, k-len);
    else
        return findKNumbers(data, beg, pos-1, k);
}
#else
int find(int *data, int len, int num)
{
    int total = 0;
    for(int i = 0; i < len; i++)
    {
        if(data[i] >= num)
            total++;
    }

    return total;
}

//binary search, until find a boundary number(!= min) of the division
int findMinOfMaxK(int *data, int len, int k)
{
    int min = data[0];
    int max = data[0];

    for(int i = 1; i < len; i++)
    {
        if(data[i] < min)
            min = data[i];
        if(data[i] > max)
            max = data[i];
    }

    while(max-min > 1)
    {
        int mid = (min + max) / 2;
        int sum = find(data, len, mid);

        if(sum == k)
            return mid;
        else if(sum > k)
            min = mid;
        else
            max = mid;
    }

    return min;
}
#endif

int main()
{
    int data[] = {1, 5, 2, 6, 3};
    int k = 3;
    #if 0
    int pos = findKNumbers(data, 0, sizeof(data)/sizeof(int)-1, k);

    for(int i = 0; i <= pos; i++)
        cout << data[i] << " ";
    cout << endl;
    #else
    int min = findMinOfMaxK(data, sizeof(data)/sizeof(int), k);

    for(int i = 0; i < sizeof(data)/sizeof(int); i++)
        if(data[i] >= min)
            cout << data[i] << " ";
    cout << endl;
    #endif
    //cout << "Hello world!" << endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值