意外的 - 寻找最大和第二最大值

时间:2014-02-14 08:30:38

标签: c data-structures runtime-error tournament

我正在尝试用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}}的输出 1 2 3 4 5

是  最大= 4195048

下一个最大= 32588

此输出每次都会有少量变化!

如果我在构建函数之前放置测试printf命令,它就不会执行。

有人能找到错误/解释输出吗? 谢谢:))

1 个答案:

答案 0 :(得分:0)

你的代码对我来说似乎很糟糕。你不介意超出数组边界,这是产生随机结果的好方法:

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]