实验六:排序算法应用 1.录入学生基本信息 2、直接插入排序 3、冒泡排序 4、快速排序 5、简单选择排序 6、堆排序

本文介绍了一个学生成绩管理系统的设计与实现,该系统利用多种排序算法(包括直接插入排序、冒泡排序、快速排序、简单选择排序和堆排序)对学生考试成绩进行排序。通过实际案例展示了不同排序算法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*实验六:排序算法应用
内容:
给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作:
(1)设计一个显示对学生信息操作的菜单函数如下所示:
*************************
1、录入学生基本信息
2、直接插入排序
3、冒泡排序
4、快速排序
5、简单选择排序
6、堆排序*/

#include<stdio.h>

#include<stdlib.h>

#define n 5
typedef struct student{
int num;
char name[20];
int score;
int rank;
}Student;
void Save(Student *pw){
FILE *fp;
int i;
if((fp=fopen("stuent.dat","wb"))==NULL){
printf("Can not open file\n");
exit(1);
}
for(i=0;i<n;i++){
fwrite(pw,sizeof(Student),1,fp);
pw++;

}
fclose(fp);
}
void Load(Student *pr){
FILE *fp;
int i;
if((fp=fopen("stuent.dat","rb"))==NULL){
printf("Can not open file\n");
exit(1);
}
for(i=0;i<n;i++){
fread(pr,sizeof(Student),1,fp);
pr++;
}
fclose(fp);

void Printf(Student *stu){
printf("学号   姓名  成绩  名次\n");
for(int i=0;i<n;i++){
printf("%d %s %d  %d",stu[i].num,stu[i].name,stu[i].score,i+1);
printf("\n");
}
}
///////////////////////////////////////////


//直接插入排序 
void InsertSort(Student *stu){
int i=0;
int b,j;
Student *stu1;
stu1=(Student *)malloc(sizeof(Student));
//Load(stu);
for(int i=1;i<n;i++){
if(stu[i].score>stu[i-1].score){
stu1[0]=stu[i];
for(j=i-1;stu1[0].score>stu[j].score&&j>=0;--j)//这里注意j的取值 
stu[j+1]=stu[j];
stu[j+1]=stu1[0];
}
}
Printf(stu); 
}
//冒泡排序
void MaopaoSort(Student *stu){
//Load(stu);
int temp;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(stu[j].score>stu[j+1].score){
temp=stu[j].score;
stu[j].score=stu[j+1].score;
stu[j+1].score=temp;
}  
}
}
Printf(stu);


 
//快速排序
int Partition (Student *stu,int low,int high){
Student *stu1;
stu1=(Student *)malloc(sizeof(Student));
int pivotkey;
stu1[0]=stu[low];
pivotkey=stu[low].score;
while(low<high){
while(low<high&&stu[high].score<=pivotkey)
--high;
stu[low]=stu[high];
while(low<high&&stu[low].score>=pivotkey){
++low; 
}
stu[high]=stu[low];
}
stu[low]=stu1[0];
return low;

void QSort(Student *&stu,int low,int high){

int pivotkey;
if(low<high){
pivotkey=Partition(stu,low,high);
QSort(stu,low,pivotkey-1);
QSort(stu,pivotkey+1,high); 
}
}
void QuickSort(Student *stu){
// Load(stu);//如果把这条语句放到上面那么输出结果就是错误的 
QSort(stu,0,n-1);
Printf(stu);
}



//简单选择排序
void SelectSort(Student *stu){
//Load(stu);
Student *stu1;
stu1=(Student *)malloc(sizeof(Student));
int i,j,temp,k=0;
// Load(stu);
for(int i=0;i<n;i++){
k=i;
for(int j=i+1;j<n;j++){
if(stu[k].score<stu[j].score)
k=j;

if(k!=i){
stu1[0]=stu[k];
stu[k]=stu[i];
stu[i]=stu1[0];
}

Printf(stu);





//堆排序
void Heapadjust(Student *stu,int s,int m){
//Load(stu);
Student *stu1;
stu1=(Student *)malloc(sizeof(Student));
stu1[0]=stu[s];
for(int j=2*s;j<=m;j*=2){
if(j<m&&stu[j].score<stu[j+1].score){
++j;
}
if(!(stu1[0].score<stu[j].score)){
break;
}
stu[s]=stu[j];
s=j;
}
stu[s]=stu1[0];
}
void HeapSort(Student *stu){
//Load(stu);
Student *stu2;
int i;
stu2=(Student *)malloc(sizeof(Student));
for(int i=(n-1)/2;i>0;i--){
Heapadjust(stu,i,n-1);
}
for(int i=n-1;i>0;i--){
stu2[1]=stu[0];
stu[0]=stu[i];
stu[i]=stu2[1];
Heapadjust(stu,0,i);
}
Printf(stu);
}
int main(){
Student In[n],Out[n],*stu2;
int i,low,high;
printf("请输入%d个学生的信息:\n",n);
printf("学号  姓名 成绩 \n");
for(i=0;i<n;i++){
scanf("%d",&In[i].num);
getchar();
scanf("%s",In[i].name);
getchar();
scanf("%d",&In[i].score); 

printf("输出学生信息 :"); 
Save(In);
Load(Out); 
InsertSort(Out);
MaopaoSort(Out);
QuickSort(Out);
SelectSort(Out);
HeapSort(Out);
return 0;


































评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值