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

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

#include

#include

#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 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 fread(pr,sizeof(Student),1,fp);
pr++;
}
fclose(fp);

void Printf(Student *stu){
printf("学号   姓名  成绩  名次\n");
for(int i=0;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 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 for(int j=i+1;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 while(low --high;
stu[low]=stu[high];
while(low=pivotkey){
++low; 
}
stu[high]=stu[low];
}
stu[low]=stu1[0];
return low;

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

int pivotkey;
if(low 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 k=i;
for(int j=i+1;j if(stu[k].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 ++j;
}
if(!(stu1[0].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 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.录入学生基本信息 2、直接插入排序 3、冒泡排序 4、快速排序 5、简单选择排序 6、堆排序)