我正在尝试用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命令,它就不会执行。
有人能找到错误/解释输出吗? 谢谢:))
答案 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]
。