求解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;
}

  

posted @ 2013-12-05 20:50  曹守鑫  阅读(279)  评论(0编辑  收藏  举报