簡體   English   中英

C在浮點數組中找到2個最大數字和2個最小數字

[英]C find the 2 largest numbers and 2 smallest numbers in float array

我真的很沮喪,我一整天都在努力使它起作用,但從未弄清楚。 我需要從arr[11]找到2 largest2 smalllest數字。

到目前為止,這是我所做的:

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;

}

您可以對其進行排序,但是如果數組變大,它將為O(n log n)。 不過,這對於11個元素來說是無關緊要的,如果您確定它始終為11,那么排序將是最簡單的方法。

如果不這樣做,從理解代碼的角度來看,最簡單的方法是:

  1. 一遍遍數組以標識最小值和最大值。 不僅記錄最小和最大,還記錄它們的位置。
  2. 再次遍歷數組,找到最小值和最大值,但忽略在第一次遍歷中找到的元素。

就您擁有的代碼而言,問題出在這里:

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

這是在您的第一個循環之后, i從1到10。在循環結束時, i的值應該是11。但是現在您一直在掃描,而i仍在增加...您已經越過數組末尾!

您實際上必須從11個總體中排序4個元素。您還必須處理極端情況,例如極端元素相等。

qsort ,請考慮對數組進行排序 (使用qsort ),然后取出前兩個元素和最后兩個元素作為答案。

確實,您不必要對7個元素進行排序,但是作為補償,您的代碼將很穩定,因為它使用標准庫函數來完成艱苦的工作。 qsort的對數算法不會為此qsort太多qsort ,因為4和11在對數空間中的大小相似。

當然,如果總體數量增加,因此O(N Log N)變大,那么如果您的用例需要,則可能必須切換到手動編碼解決方案。

我認為您需要在這部分代碼之前重新初始化i的值。 它超出了數組的范圍,因為i for循環值之后為11

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

在此之前加i = 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進行比較總是錯誤的,即使NAN == NAN也是錯誤的。 使用!(a<=b) ,如果a大於baNANbNAN ,則比較為true。

注意:僅顯示問題的最大一半。 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM