求解N个值中最大的k个数,N远大于k
该方法思想:将N个数分为N/K段,查找每一段的最大值,然后在N/k个最大值中选择一个最大值,然后在选择最大值的那段中,再选择一个最大值,一次类推直到完成K个最大值的选择
时间复杂度接近O(n)
代码如下:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;
int getMaxFromArray(int numb[],int begIndex,int endIndex)
{
int result=numb[begIndex];
int indexValue=begIndex;
for (int i=begIndex+1;i<endIndex;i++)
{
if (numb[i]>result)
{
result=numb[i];
indexValue=i;
}
}
numb[indexValue]=INT_MIN;
return result;
}
int main()
{
int numb[1000];
int n;
while (scanf("%d",&n)!=EOF)
{
for (int i=0;i<n;i++)
{
scanf("%d",numb[i]);
}
int k;
scanf("%d",&k);
if (k>=n)
{
for (int i=0;i<n;i++)
{
printf("%d ",numb[i]);
}
}else
{
int interval=n/k;
int *tmp=new int[k];
int *result=new int[k];
int begindex=0,endIndex=0;
for (int i=1;i<=k;i++)
{
endIndex=i*interval;
tmp[i-1]=getMaxFromArray(numb,begindex,endIndex);
begindex=endIndex;
}
int maxValue=tmp[0];
int indexValue=0;
int copyK=k-1;
for (int i=1;i<k;i++)
{
if (tmp[i]>maxValue)
{
maxValue=tmp[i];
indexValue=i;
}
}
result[0]=maxValue;
while (copyK)
{
tmp[indexValue]=getMaxFromArray(numb,(indexValue-1)*interval,indexValue*interval);
maxValue=tmp[0];
indexValue=0;
for (int i=1;i<k;i++)
{
if (tmp[i]>maxValue)
{
maxValue=tmp[i];
indexValue=i;
}
}
result[k-copyK]=maxValue;
copyK--;
}
}
}
return 0;
}

浙公网安备 33010602011771号