该方法思想:将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; }