楼主,你都已经知道错误了,为什么不一次性全部改完呢?
之前只所以张冠李戴,是因为你犯了如下的错误:
void sift(int startPos,int endPos,int score[],int number[])
{
int k=startPos*2+1,temp1,temp2;
temp1=score[startPos];
temp2=number[startPos];
while(k<endPos)
{
if(k+1<endPos&&score[k]<score[k+1])
k++;
else if(k+1<endPos&&score[k]==score[k+1]&&number[k]>number[k+1])
k++;
if(temp1<score[k])
{
score[startPos]=score[k];//问题在这里!
//你只调整了分数的位置,但没有调整相对应的学号的位置
//number[startPos] = number[k];
startPos=k;
k=startPos*2+1;
}
else if(score[k]==temp1&&number[k]>number[k+1])
{
score[startPos]=score[k];//It's the same!
startPos=k;
k=startPos*2+1;
}
else break;
}
score[startPos]=temp1;
number[startPos]=temp2;
}
其实,你的程序包含着一个非常重大的错误,是思路上的缺陷。但感觉你现在只想把这个小东西先完成了再说。如果你想有更大的进步,我希望你能继续就这个程序重新编写,用结构体,像“点线面”说的那样。
C语言程序设计有很广阔的天空呢,继续努力!!!
之前只所以张冠李戴,是因为你犯了如下的错误:
void sift(int startPos,int endPos,int score[],int number[])
{
int k=startPos*2+1,temp1,temp2;
temp1=score[startPos];
temp2=number[startPos];
while(k<endPos)
{
if(k+1<endPos&&score[k]<score[k+1])
k++;
else if(k+1<endPos&&score[k]==score[k+1]&&number[k]>number[k+1])
k++;
if(temp1<score[k])
{
score[startPos]=score[k];//问题在这里!
//你只调整了分数的位置,但没有调整相对应的学号的位置
//number[startPos] = number[k];
startPos=k;
k=startPos*2+1;
}
else if(score[k]==temp1&&number[k]>number[k+1])
{
score[startPos]=score[k];//It's the same!
startPos=k;
k=startPos*2+1;
}
else break;
}
score[startPos]=temp1;
number[startPos]=temp2;
}
其实,你的程序包含着一个非常重大的错误,是思路上的缺陷。但感觉你现在只想把这个小东西先完成了再说。如果你想有更大的进步,我希望你能继续就这个程序重新编写,用结构体,像“点线面”说的那样。
C语言程序设计有很广阔的天空呢,继续努力!!!
当一名对得起学生学费的老师,一直是我的目标!我会更努力的!