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

      

  • 相关阅读:
    汉语-汉字:牝
    影视-电影:《最佳拍价》
    影视-纪录片:《鳗鱼的故事》
    影视-电影:《英雄本色2018》
    影视-纪录片:《中国粮食奇迹》
    汉语-词语:响马
    Mysql 8 常用命令测试
    解决MySQL8.0报错:Unknown system variable 'validate_password_policy'
    List or delete hidden files from command prompt(CMD)
    Reg 命令修改注册表
  • 原文地址:https://www.cnblogs.com/csxf/p/3460329.html
Copyright © 2020-2023  润新知