C找到float数组中最大的2个数和2个最小数

时间:2014-12-15 13:32:47

标签: c arrays numbers

我真的很沮丧,我整日都努力让它成功,但从来没有弄明白。 我需要从2 largest找到2 smalllestarr[11]个数字。

这是我到目前为止所做的事情:

int main(){

float arr[11] ,max = 0, max2, min, min2;
int i = 0;

for (i = 0; i < 11; i++){
    scanf("%f", &arr[i]);
}

max = arr[0];
max2 = arr[0];
min = arr[0];
min2 = arr[0];

for (i = 1; i < 11; i++){
    if (arr[i] > max)
        max = arr[i];
    if (arr[i] < min)
        min = arr[i];
}

while (min == min2){
    min2 = arr[1 + i];
    i++;
}


for (i = 10; i > 0; i--){
    if (arr[i] > max2 && arr[i] < max)
        max2 = arr[i];
    if (arr[i] < min2 && arr[i] > min)
        min2 = arr[i];
}

printf("Max = %.2f\nMax2 = %.2f\nMin = %.2f\nMin2 = %.2f", max, max2, min, min2);
getch();
return 0;

}

4 个答案:

答案 0 :(得分:2)

你可以对它进行排序,但如果数组变得更大,那将是O(n log n)。但是,它与11个元素无关,如果你确定它总是11个,那么排序将是最简单的方法。

如果做不到这一点,从理解代码的角度来看,最简单的方法是:

  1. 通过数组进行一次传递以确定最小值和最大值。不仅记录最小值和最大值,还记录它们的位置。
  2. 再次通过数组,找到min和max,但忽略在第一遍中找到的元素。
  3. 就您所拥有的代码而言,问题在于:

    while (min == min2){
        min2 = arr[1 + i];
        i++;
    }
    

    这是在你的第一个循环之后,其中i从1到10运行。在循环结束时,i的值将是11.但是现在你要保持扫描,i仍然在增加......你已经超越了数组的末尾!

答案 1 :(得分:1)

你实际上必须从11个人口中排序4个元素。你还必须处理极端元素相等的边缘情况。

考虑到这一点,考虑排序数组(使用qsort)然后取出前两个元素作为答案。

实际上,您不必要地对7个元素进行排序,但是,在补偿方面,您的代码将是稳定的,因为它使用标准库函数来完成艰苦的工作。 qsort的对数算法不会对你造成过多的惩罚,因为4和11在对数空间中具有相似的幅度。

当然,如果人口规模增加使得O(N Log N)变大,那么如果您的用例需要,则可能必须切换到手动编码的解决方案。

答案 2 :(得分:0)

我认为您需要在此部分代码之前重新启动i的值。它超出了数组范围,因为之前for循环值i11

while (min == min2){
    min2 = arr[1 + i];
    i++;
}

在此之前添加i = 0。 另请注意,当此数组中的所有浮点数相等时,部分代码将无限期。

答案 3 :(得分:0)

只需要1次传球。首先将每个值与非极端值进行比较。

如果允许绑定,请使用>=<=

max2 = -FLT_MAX; // greatest  
max  = -FLT_MAX; // almost greatest
min  =  FLT_MAX; // almost least
min2 =  FLT_MAX; // least

for (i = 0; i < 11; i++){
  if (arr[i] > max) {
    max = arr[i];
    if (max > max2) {
      max = max2;
      max2 = arr[i];
    }
  }
  if (arr[i] < min) {
    min = arr[i];
    if (min < min2) {
      min = min2;
      min2 = arr[i];
    }
  }
}

printf("Max = %.2f\nMax2 = %.2f\nMin = %.2f\nMin2 = %.2f", max, max2, min, min2);

一种漂亮的方法使用NAN - 而不是数字。请注意!(a<=b)而不是(a>b)。由于NAN,这些是不同的。与NAN相比,总是为false,即使NAN == NAN为false。使用!(a<=b)时,如果a大于baNANbNAN,则比较为真}。

注意:只显示问题的最大一半。 0.0 / 0.0 - > NAN。

// Initialize both to NAN
max2 = 0.0f/0.0f; // greatest  
max  = 0.0f/0.0f; // almost greatest

for (i = 0; i < 11; i++) {
  if (!(arr[i] <= max)) {
    max = arr[i];
    if (!(max <= max2)) {
      max = max2;
      max2 = arr[i];
    }
  }
}

printf("Max = %.2f\nMax2 = %.2f\n", max, max2);