Неожиданный выход - Нахождение максимума и второго максимума

Я пытаюсь реализовать простой турнир на C.

#include <stdio.h>

int main(void) {
    int tourn[100], n, i;
    printf("Give n:");
    scanf("%d", &n);
    printf("\n n = %d \n", n);
    for(i = n; i <= (2*n)-1; i++)
        scanf("%d", &tourn[i]);
    build(tourn, n);
    printf("\n Max = %d \n",tourn[1]);
    printf("\n Next Max = %d \n",nextmax(tourn, n));
 }

 void build(int tourn[], int n) {
    int i;
    for(i = 2*n-2; i > 1; i = i-2)
        tourn[i/2] = max(tourn[i], tourn[i+1]);
  }  

 int nextmax(int tourn[],int n) {
    int i = 2;
    int next;
    next = min(tourn[2], tourn[3]);
    while(i <= 2*n-1) {
        if(tourn[i] > tourn[i+1]) {
            next = max(tourn[i+1], next);
            i = 2*i;
        }
        else {
            next = max(tourn[i], next);
            i = 2*(i+1);
        } 
    }
    return(next);
}

int max(int i,int j) {
    if(i > j)
        return i;
    else
        return j;
}                       

int min(int i,int j) {
    if(i < j)
        return i;
    else
        return j;
} 

Выход для n = 5 и 1 2 3 4 5

Макс = 4195048

Следующий Макс = 32588

и этот результат меняется каждый раз на небольшое количество!

если я помещу тестовую команду printf перед функцией сборки, она не будет выполнена.

Может кто-нибудь найти ошибку / объяснить выход? Спасибо:)

1 ответ

Твой код кажется мне неработоспособным. вы не возражаете против адресации за пределами вашего массива, что является хорошим способом получения случайных результатов:

while(i <= 2*n-1){
        if(tourn[i]>tourn[i+1]){
                next = max(tourn[i+1],next);
                i=2*i;
        } else {  
                next = max(tourn[i],next);
                i=2*(i+1);
        } 
}

Ваш (логический) массив имеет размер 2n, если i достигает "наивысшего" значения, вы тестируете tourn[i + 1], который tourn[2n],

Другие вопросы по тегам