3数组中没有排序的最大数字,我在哪里丢失逻辑?

3数组中没有排序的最大数字,我在哪里丢失逻辑?

问题描述:

该程序用于查找数组中的3个最高数字。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 
+7

有两种方法可以解决这样的问题:1)在调试器中运行你的代码,一次一行地观察变量值,直到找到在哪里没有做你想做的事情; 2)在代码中的关键点插入输出语句('printf')以查看发生了什么。 SO工作的方式不是:“这是我的代码,请为我调试”。你在调试之后,在解释你所做的事情之后,询问你是否仍然不明白。 –

+0

它只是你想要的前3个数字,或者可以更多(将来)? –

+0

和列表总是会成为一个唯一的数字集合? –

我不知道,如果能够以更简单的方式完成这些工作,那么你的目的是什么? 这是另一种在一次迭代中查找前三位数字的方法; 希望你喜欢它,它可能会在未来帮助你。

来源:

#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; 
} 

OUTPUT:

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

'int a [10] = {5,4,3,9,6,8,2,7,1};' – user3386109

+0

更正,在数组中添加一个更多元素使其成为10个元素的列表:) –

+2

@NitinTripathi这不是问题。问题是如果最大的数字出现在第二和第三大数字之前,那么你的逻辑不起作用。 –

我看到以下问题:

  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; 
    

    是误差源。如果它们接近列表的末尾,它将无法正确检测到第二个和第三个最大值。

这是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 

它似乎为我工作。

你的一个问题是与线

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

这种情况将被while循环(假设最高分出现只有一次),每次迭代一次遇见你做......的,下一个只有当最高数字不是第一个时才会执行。

这不是代码的唯一问题。Nitin Tripathi的评论暗示了这些代码不适用的许多条件。

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

评论你的代码可能会帮助你很多。

您需要梳理^ 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(); 
} 

#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))

+0

[现场演示](http://coliru.stacked-crooked.com/a/ef093881a09722fa) – sp2danny