学生成绩管理系统
源代码在线查看: sort.cpp
#include "headfile.h"
//使用堆排序对各科成绩按从高到低排列
Status Sort(Hash *H)
{
HeapType a,b,c;
int i,j,k,m;
stu t;
j=k=m=1;
a.length=b.length=c.length=0;
//把哈希表中的数据放到堆结构中
for(i=0;i {
if(H[i])
{
t=H[i];
while(t)
{
a.r[j]=t->s.datastruct;
b.r[k]=t->s.english;
c.r[m]=t->s.math;
j++;
k++;
m++;
a.length++;
b.length++;
c.length++;
t=t->next;
}
}
}
//中文成绩
if(a.length>1)
{
HeapSort (a);
printf(" 数据结构成绩从高到低排列为:\n\n");
for(i=a.length;i>0;i--)
printf("%d ",a.r[i]);
printf("\n\n");
Calculate(a);
printf("\n\n");
}
//英文成绩
if(b.length>1)
{
HeapSort (b);
printf(" 英文成绩从高到低排列为:\n\n");
for(i=b.length;i>0;i--)
printf("%d ",b.r[i]);
printf("\n\n");
Calculate(b);
printf("\n\n");
}
//数学成绩
if(c.length>1)
{
HeapSort (c);
printf(" 数学成绩从高到低排列为:\n\n");
for(i=c.length;i>0;i--)
printf("%d ",c.r[i]);
printf("\n\n");
Calculate(c);
printf("\n\n");
}
return OK;
}
void HeapAdjust (HeapType &H , int s, int m)
{ // 已知 R[s..m]中记录的关键字除 R[s] 之外均
// 满足堆的特征,本函数自上而下调整 R[s] 的
// 关键字,使 R[s..m] 也成为一个大顶堆。
int rc;
int j;
rc = H.r[s]; // 暂存 R[s]
for ( j=2*s; j //自上而下的筛选过程;
if ( j // 左/右“子树根”之间先进行相互比较
// 令 j 指示关键字较大记录的位置
if ( !LT(rc ,H.r[j]) ) break;
// 再作“根”和“子树根”之间的比较,
// 若“>=”成立,则说明已找到 rc 的插
// 入位置 s ,不需要继续往下调整
H.r[s] = H.r[j]; s = j;
// 否则记录上移,尚需继续往下调整
}
H.r[s] = rc; // 将调整前的堆顶记录插入到 s 位置
} // HeapAdjust
void HeapSort ( HeapType &H ) {
// 对顺序表 H 进行堆排序。
int temp;
int i;
for ( i=H.length/2;i>0;--i )
HeapAdjust ( H, i, H.length ); // 建大顶堆
for ( i=H.length; i>1; --i ) {
//H.r[1]←→H.r[i];
temp=H.r[1];
H.r[1]=H.r[i];
H.r[i]=temp;
// 将堆顶记录当前未经排序子序列
// H.r[1..i]中最后一个记录相互交换
HeapAdjust(H, 1, i-1); // 对 H.r[1] 进行筛选
}
} // HeapSort
//统计各个分数段的人数
void Calculate(HeapType h)
{
int a,b,c,d,e;
int i;
a=b=c=d=e=0;
for(i=1;i {
if(h.r[i]>=90)
a++;
else if(h.r[i]>=80)
b++;
else if(h.r[i]>70)
c++;
else if(h.r[i]>60)
d++;
else
e++;
}
printf("90分以上的有%d人 ",a);
printf("80-90分的有%d人\n",b);
printf("70-80分的有%d人 ",c);
printf("60-70分的有%d人\n",d);
printf("60分以下的有%d人\n",e);
}