输入学号与成绩,成绩大的排到前面。如果将要交换的两个成绩相同,则学号小的排在前面。
输入:
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;
}