数据结构 实验报告 排序.doc
文本预览下载声明
实验报告
实验目的:
掌握各种排序方法的排序过程;
了解一些排序算法的实现。
实验内容:
学生的考试成绩表由学生的学号、姓名和成绩组成,设计一个程序对给定的n个学生信息实现:
1.按分数高低排序,打印出每个学生在考试中的排名,分数相同的为同一名次,同一名次的学生按学号从小到大排列。
2.按照名次列出每个学生的名次、学号、姓名、成绩。
实验原理:
排序分为插入排序、交换排序、选择排序、归并排序等。插入排序又分为直接插入排序、其他插入排序和希尔排序;交换排序分为冒泡排序和快速排序;选择排序又分为简单选择排序和堆排序。不同的排序方法各有利弊,根据具体的情况选择合适的排序方法。
设计思想:
本程序采用简单选择排序的方法。程序中定义一个stu结构和student类。类中定义creat创建函数,selectgrade成绩排序函数,samegrade、selectnum成绩相同的按学号排序函数,print输出函数。按照选择排序的思想,先对成绩按照从高到低进行排序;然后寻找成绩相同的部分,对该局部元素的学号从小到大进行排序。然后调用输出函数,输出名次、学号、姓名、成绩。
实现部分:
源代码:
#includeiostream.h
struct stu
{
int num;
char name[100];
int grade;
};
class student
{ struct stu s[100];
int length;
int start,end;
public:
student(){length=0;}
void creat();
void selectgrade();
void samegrade();
void selectnum();
void print();
};
//创建顺序表
void student::creat()
{
cout请依次输入学生的学号、姓名、成绩。输入#结束:endl;
int num;
cinnum;
while(num)
{s[length].num=num;
cins[length].name;
cins[length].grade;
cinnum;
length++;}}
//对成绩进行选择排序
void student::selectgrade()
{
stu temp;
int i,j,k;
for(i=0;ilength;i++)
{k=i;
for(j=i+1;jlength;j++)
{if(s[j].grades[k].grade)k=j;}
if(k!=i)
{temp=s[i];
s[i]=s[k];
s[k]=temp;
}
}
}
//对成绩相同的学号进行选择排序
void student::samegrade()
{
int i,j;
for(i=0;ilength;i++)
{if(s[i].grade==s[i+1].grade)
{for(j=length-1;;j--)
{if(s[j].grade==s[i].grade)break;}
start=i;end=j;i=j;}
selectnum();
}
}
//对学号进行选择排序
void student::selectnum()
{
stu temp;
int i,j,k;
for(i=start;i=end;i++)
{k=i;
for(j=i+1;j=end;j++)
{if(s[j].nums[k].num)k=j;}
if(k!=i)
{temp=s[i];
s[i]=s[k];
s[k]=temp;
}
}
}
void student::print()
{
int i,j=0,k=0;
cout成绩从高到低依次为(成绩相同按学号从小到大排列)endl;
cout名次 学号 姓名 成绩endl;
for(i=0;ilength;i++)
{ if(i==0)coutk+1 s[i].num s[i].name s[i].gradeendl;
else{if(s[i].grade==s[i-1].grade){j++;k=i-j;}
else {j=0;k=i-j;}
coutk+1 s[i].num s[i].name s[i].gradeendl;} }
}
int main()
{
student ss;
ss.creat();
ss.selectgrade();
ss.samegrade();
ss.print();
}
测试用例1.
实验小节:
通过本程序的练习,对
显示全部