讨论 / 我用堆排序为什么会出错?
sunyuhong 2011-01-29 01:51:00
点我顶贴 收藏 删除
为了避免元素太多以至于混乱,所以我先做一个小例子:

输入学号与成绩,成绩大的排到前面。如果将要交换的两个成绩相同,则学号小的排在前面。

输入:

6

1000 90

3239 88

2390 95

7231 84

1005 95

1001 88

输出:

7231 84

3239 88

1001 88

1000 90

2390 95

1005 95

我将代码写出来了,但是有很多问题,一个是成绩不能成为有序排列,而且学号还会“张冠李戴”:

#include <stdio.h>

#include <stdlib.h>

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&&number[k]==number[k+1]&&number[k]>number[k+1])k++;

if(temp1>score[k])

{

score[startPos]=score[k];

startPos=k;

k=startPos*2+1;

}

else if(score[k]==temp1&&number[k]>number[k+1])

{

score[startPos]=score[k];

startPos=k;

k=startPos*2+1;

}

else break;

}

score[startPos]=temp1;

number[startPos]=temp2;

}

void heap_sort(int number[],int score[],int n)

{

int i,temp;

for(i=n/2;i>=0;i--)

sift(i,n,score,number);

for(i=n-1;i>=0;i--)

{

temp=number[i];number[i]=number[0];number[0]=temp;

temp=score[i];score[i]=score[0];score[0]=temp;

sift(0,i,score,number);

}

}

int main()

{

int number[10]={0},score[10]={0},n,i;

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d %d",&number[i],&score[i]);

heap_sort(number,score,n);

printf("\n");

for(i=0;i<n;i++)

printf("%d %d\n",number[i],score[i]);

system("pause");

return 0;

}

查看更多回复
提交回复