find the N max numbers from an array

来源:互联网 发布:上海科创板交易软件 编辑:程序博客网 时间:2024/04/30 14:31
//find the N max numbers from an array#include <iostream>using namespace std;#if 0void 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 numberint 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);}#elseint 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 divisionint 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;}#endifint 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;}


原创粉丝点击