找到K(10)个数中的N(3)个最大数

时间:2013-12-24 09:36:55

标签: c algorithm numbers compare

我想从10个数字(scanf)中找到三个最大的数字(区域),我写了这个代码,但是当我运行它时,只有最大数字是正确的,第二个和第三个最大数字是错误的。所以,我需要帮助。有什么建议?圣诞快乐!

#include <stdio.h>
#define N 3

int main()
{
        int i,j;
        int area; 
        int maxArea[N]; 
        int empty = N;

     for(j=0;j<10;j=j+1)
     {    
         printf("Input:");
          scanf("%d",&area);
          printf("\n");

         if(empty > 0)
         {
           maxArea[N-empty]=area;

           empty=empty-1;
         }
         else
         {
           for(i=0; i < N; i=i+1)
           {
             if(area>maxArea[i])
             {
               maxArea[i]=area;

               break;
             }
           }
         }
       }
       printf("Area1=%d\n",maxArea[0]);
       printf("Area2=%d\n",maxArea[1]);
       printf("Area3=%d\n",maxArea[2]);

}

3 个答案:

答案 0 :(得分:1)

首先,您应该将所有数组元素初始化为零。

此外,您的代码无法正常工作,因为您只检查数组中第一个元素是否小于新元素。

如果数组有6,3,2并且新元素是7,那么7将从数组中弹出6并且数组将变为7,3,2。相反它应该是7,6,3。

您应该弹出数组中的最小数字。

在一般情况下,minheap将是最佳度假胜地。 (对于k个最大的元素)

答案 1 :(得分:1)

我只想向您展示一种不同的方法,您必须自己决定什么更容易;

首先,我使用尽可能小的整数初始化maxArea。这样,如果它还不包含3个数字,我不需要特殊处理。任何数字都会比MIN_INT更大,因此会自动替换。

for(i=0; i < N; i++)
{
   maxArea[i]=MIN_INT;
}

在循环中,我用旧的最大值交换区域,并且我继续运行循环,因此旧的值将重用于其他最大值。

for(j=0;j<10;j=j+1)
{    
     printf("Input:");
     scanf("%d",&area);
     printf("\n");

     for(i=0; i < N; i++)
     {
         if(area>maxArea[i])
         {
           // swap both
           int temp=maxArea[i];
           maxArea[i]=area;
           area=temp;
         }
     }
 }

请注意,这不是非常优化,但最好还是阅读正在发生的事情。 maxArea[0]永远是大人物,maxArea[1]是下一个等等。

例如,如果数组是[6,3,2],并且新区域是5;

  • 第一个循环中不会发生任何事情,因为5小于6。
  • 在第二个循环(i = 1)中,数组将变为[6,5,2],区域将为3.
  • 在第三个循环中,数组将变为[6,5,3],区域将为2,(但不会再使用2)。

答案 2 :(得分:1)

#include <stdio.h>
#include <limits.h>
#include <string.h>

#define N 3

int main(){
    int i,j;
    int area; 
    int maxArea[N];

    for(i=0;i<N;++i)
        maxArea[i]=INT_MIN; 

    for(j=0;j<10;++j){    
        printf("Input:");
        scanf("%d",&area);
        printf("\n");
        for(i = 0;i<N && i <= j;++i){
            if(area > maxArea[i]){
                memmove(&maxArea[i+1], &maxArea[i], (N-i-1)*sizeof(*maxArea));
                maxArea[i] = area;
                break;
            }
        }
    }

     printf("Area1=%d\n", maxArea[0]);
     printf("Area2=%d\n", maxArea[1]);
     printf("Area3=%d\n", maxArea[2]);

    return 0;
}