1. 程式人生 > >實驗六:排序演算法應用 1.錄入學生基本資訊 2、直接插入排序 3、氣泡排序 4、快速排序 5、簡單選擇排序 6、堆排序

實驗六:排序演算法應用 1.錄入學生基本資訊 2、直接插入排序 3、氣泡排序 4、快速排序 5、簡單選擇排序 6、堆排序

/*實驗六:排序演算法應用
內容:
給出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;