没有排序的数组中的3个最高数字,我在哪里错过逻辑?

时间:2015-09-28 05:06:37

标签: c arrays sorting highest

此程序用于查找数组中的3个最高数字。

当我运行代码时,我获得第一名和第二名。第二个最高的是重复第三个数字

我在逻辑中缺少什么?

#include<stdio.h>
#include<conio.h>

int main()
{
   int i,k,n,m[20],h[3];
   printf("\n enter the total number of students");
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
      printf("enter the marks scored by student %d",i+1);
      scanf("%d",&m[i]);
   }//end for loop
   k=0;
   h[k]=m[0];
   for(i=0;i<n;i++)
   {
      if(m[i]>h[k])
      {
         h[k]=m[i];
      }
   }//end for loop
   do
   {
      //Probably messed my code here
      k++;
      h[k]=m[0];
      for(i=0;i<n;i++)
      {
         if(m[i]>=h[k-1])
         {
            if(m[i]>h[k])
            {
               h[k]=m[i];
            }//end if
            break;
         }//end if
      }//end for loop
   }//end do loop
   while(k<3);
   printf("the first 3 highest marks are:\n");
   for(i=0;i<k;i++)
      printf("%d:%d\n",i+1,h[i]);
   getch();
}//end of main

5 个答案:

答案 0 :(得分:3)

我不知道,如果可以用更简单的方式完成,那么编写如此繁琐的代码行的目的是什么。 这是另一种在一次迭代中找到前3个数字的方法; 希望你喜欢它,它可能会对你有所帮助。

  

来源:

#include<stdio.h>
#include<limits.h>
int main()
{
    int a[10] = {5,4,3,6,7,8,9,10,1,2};
    int h1 = INT_MIN; //TOP 1st
    int h2 = INT_MIN; //TOP 2nd
    int h3 = INT_MIN; //TOP 3rd
    for(int i=0;i<10;i++)
    {
        if(a[i] > h1)
        {
            h3 = h2; h2 = h1; h1 = a[i];
        }
        else if (a[i] > h2)
        {
            h3 = h2; h2 = a[i];
        }
        else if  (a[i] > h3)
        {
            h3 = a[i];
        }
    }
    printf("TOP 1st is<%d>\n",h1);
    printf("TOP 2nd is<%d>\n",h2);
    printf("TOP 3rd is<%d>\n",h3);
    return 0;
}
  

输出:

./a.out 
TOP 1st is<10>
TOP 2nd is<9>
TOP 3rd is<8>

答案 1 :(得分:0)

我看到以下问题:

  1. 该行

    h[k]=m[0];
    
    如果m[0]是最大值或第二大值,

    将导致问题。将其更改为:

    h[k]=INT_MIN;
    
  2. 该行

     if(m[i]>=h[k-1])
    

    似乎错了。那应该是

     if(m[i] < h[k-1])
    
  3. 该行

        break;
    

    是错误的来源。如果它们位于列表末尾,它将无法正确检测第二和第三大值。

  4. 这里是do/while阻止这些修复程序。

    do
    {
       k++;
       h[k]=INT_MIN;
       for(i=0;i<n;i++)
       {
          if(m[i] < h[k-1])
          {
             if(m[i]>h[k])
             {
                h[k]=m[i];
             }//end if
          }//end if
       }//end for loop
    }//end do loop
    

    这似乎对我有用。

答案 2 :(得分:0)

你的一个问题是线

if(m[i]>=h[k-1])

这个条件将在你的do ... while循环中进行一次(假设最高标记仅出现一次),并且只有当最高数字不是第一行时才会执行下一行

这不是代码的唯一问题。 Nitin Tripathi的评论提到了很多条件,这些代码不能正常工作。

我建议您使用前三个标记加载h数组。然后,使用冒泡排序算法对其进行排序,使h [0]最高,h [2]最低。然后迭代标记的剩余值。对于每个值,如果它高于h [2],则用它替换h [2]并使用相同的气泡排序算法重新排序h数组。你可以谷歌那个并找到很多例子。

评论你的代码也可能对你有很大帮助。

答案 3 :(得分:0)

您需要对h数组进行排序,以下代码正常运行

#include<stdio.h>
#include<conio.h>

void main()
{
   int i,a,j,k,n,m[20],h[3];
   int high, temp;
   printf("\n enter the total number of students");
   scanf("%d",&n);
   for(i=0;i<n;i++)
   {
      printf("enter the marks scored by student %d",i+1);
      scanf("%d",&m[i]);
   }//end for loop

   k=0;
   h[k]=m[0];

   for(i = 1; i < n; i++)
   {
      if(m[i] > h[0])
      {
     h[k] = m[i];
     k++;

     // make sure h[0] have max value out of all 3
     for (a = 0; a < k; a++)
     {
        for (j = a + 1; j < k; j++)
        {
            if (h[a] < h[j])
            {
                temp = h[j];
                h[j] = h[a];
                h[a] = temp;
            }
        }
     }
      }
   }//end for loop


   for (i = 0; i < k; i++)
   {
    printf("\n %d", h[i]);
   }

   getch();
}

答案 4 :(得分:0)

#include <algorithm>
#include <cstddef>

template<typename RanIt>
void make_N_highest( std::size_t N, RanIt b, RanIt e )
{
    std::make_heap(b,e);
    while(N--)
        std::pop_heap(b,e--);
}

这将使N个最高值在序列中排在最后。
它是O(N * log(size))