您的位置:首页 > 其它

排序算法应用

2015-12-16 20:20 465 查看
给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作:

(1)设计一个显示对学生信息操作的菜单函数如下所示:

*************************

1、录入学生基本信息

2、直接插入排序

3、冒泡排序

4、快速排序

5、简单选择排序

6、堆排序

7、2-路归并排序

8、输出学生信息

0、退出

*************************

//给出n个学生的成绩表,学号,姓名,分数,名次
//1.录入学生的基本信息 2.直接插入排序 3.冒泡排序 4.快速排序 5. 简单选择排序 6.堆排序
//2路归并排序 8 输出学生信息
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char num[10];
char name[20];
float score;
int ranking;
}Student;

void Init_student(Student stu[],int n){
for(int i=1;i<n;i++){
scanf("%s",stu[i].num);
scanf("%s",stu[i].name);
scanf("%f",&stu[i].score);
}
}

//直接插入排序
void InsetSort(Student stu[],int n){
int j;
for(int i=2;i<=n;i++){
if(stu[i].score>stu[i-1].score){
stu[0]=stu[i];
stu[i]=stu[i-1];
for(j=i-2;j>0;j--)
stu[j+1]=stu[j];
stu[j+1]=stu[0];
}
}
int number=1;
for(i=1;i<=n;i++){
if(i==1)
stu[i].ranking=number;
else{
if(stu[i].score!=stu[i-1].score)
stu[i].ranking=number;
else
stu[i].ranking=number-1;
}
number++;
printf("%d ",stu[i].ranking);
printf("%s ",stu[i].num);
printf("%s ",stu[i].name);
printf("%.2f\n",stu[i].score);
}

}

//冒泡排序
void BubbleSort(Student stu[],int n){
int i,j;
for(i=1;i<n;i++){
for(j=1;j<=n-i;j++)
if(stu[j].score<stu[j+1].score){
stu[0]=stu[j];
stu[j]=stu[j+1];
stu[j+1]=stu[0];
}
}
int number=1;
for(i=1;i<=n;i++){
if(i==1)
stu[i].ranking=number;
else{
if(stu[i].score!=stu[i-1].score)
stu[i].ranking=number;
else
stu[i].ranking=number-1;
}
number++;
printf("%d ",stu[i].ranking);
printf("%s ",stu[i].num);
printf("%s ",stu[i].name);
printf("%.2f\n",stu[i].score);
}
}

//快速排序
int Partition(Student *stu,int low,int high){
stu[0]=stu[low];
float pivotkey;
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]=stu[0];
return low;

}
void QSort(Student *stu,int low,int high){
int pivotloc;
if(low<high){
pivotloc=Partition(stu,low,high);
QSort(stu,low,pivotloc-1);
QSort(stu,pivotloc+1,high);
}
}
void QuickSort(Student *stu,int n){
QSort(stu,1,n);
int number=1,i;
for(i=1;i<=n;i++){
if(i==1)
stu[i].ranking=number;
else{
if(stu[i].score!=stu[i-1].score)
stu[i].ranking=number;
else
stu[i].ranking=number-1;
}
number++;
printf("%d ",stu[i].ranking);
printf("%s ",stu[i].num);
printf("%s ",stu[i].name);
printf("%.2f\n",stu[i].score);
}
}

//简单选择排序
void SelectSort(Student *stu,int n){
int i,j,k;
for(i=1;i<=n;i++){
k=i;
for(j=i+1;j<=n;j++){
if(stu[j].score>stu[k].score)
k=j;
}
if(k!=i){
stu[0]=stu[k];stu[k]=stu[i];stu[i]=stu[0];
}
}
int number=1;
for(i=1;i<=n;i++){
if(i==1)
stu[i].ranking=number;
else{
if(stu[i].score!=stu[i-1].score)
stu[i].ranking=number;
else
stu[i].ranking=number-1;
}
number++;
printf("%d ",stu[i].ranking);
printf("%s ",stu[i].num);
printf("%s ",stu[i].name);
printf("%.2f\n",stu[i].score);
}
}

//堆排序
void HeapAdjust(Student *stu,int s,int m){
stu[0]=stu[s];
for(int j=2*s;j<=m;j*=2){
if(j<m && stu[j].score>stu[j+1].score)
++j;
if(stu[j].score<=stu[j+1].score)
break;
stu[s]=stu[j];s=j;
}
stu[s]=stu[0];
}
void HeapSort(Student *stu,int n){
int i;
for(i=n/2;i>0;--i)
HeapAdjust(stu,i,n);
for(i=n;i>1;--i){
stu[0]=stu[1];stu[1]=stu[i];stu[i]=stu[0];
HeapAdjust(stu,1,i-1);
}
int number=1;
for(i=1;i<=n;i++){
if(i==1)
stu[i].ranking=number;
else{
if(stu[i].score!=stu[i-1].score)
stu[i].ranking=number;
else
stu[i].ranking=number-1;
}
number++;
printf("%d ",stu[i].ranking);
printf("%s ",stu[i].num);
printf("%s ",stu[i].name);
printf("%.2f\n",stu[i].score);
}
}

//2路归并排序
void Merge(Student a[],Student b[],int i,int m,int n){
int j,k,l,s;
for(j=m+1,k=i;i<=m&&j<=n;++k){
if(a[i].score>a[j].score)
b[k]=a[i++];
else
b[k]=a[j++];
}
if(i<=m)
for(l=k,s=i;l<=n,s<=m;l++,s++)
b[l]=a[s];
if(j<=n)
for(l=k,s=j;l<=n,s<=n;l++,s++)
b[l]=a[s];
}

void MSort(Student a[],Student b[],int s,int t){
int m;
Student c[10];
if(s==t)
b[s]=a[s];
else{
m=(s+t)/2;
MSort(a,c,s,m);
MSort(a,c,m+1,t);
Merge(c,b,s,m,t);
}

}

void MergeSort(Student stu[],int n){
MSort(stu,stu,1,n);
int number=1,i;
for(i=1;i<=n;i++){
if(i==1)
stu[i].ranking=number;
else{
if(stu[i].score!=stu[i-1].score)
stu[i].ranking=number;
else
stu[i].ranking=number-1;
}
number++;
printf("%d ",stu[i].ranking);
printf("%s ",stu[i].num);
printf("%s ",stu[i].name);
printf("%.2f\n",stu[i].score);
}
}

int main(){
Student *stu;
int n,chose,j;
//输入学生数目:

printf("请选择:\n");
printf("*************************\n");
printf("	1录入学生基本信息\n");
printf("	2直接插入排序\n");
printf("	3冒泡排序\n");
printf("	4快速排序\n");
printf("	5简单选择排序\n");
printf("	6堆排序\n");
printf("	72-路归并排序\n");
printf("	8输出学生信息\n");
printf("	0退出\n");

while(1){
scanf("%d",&chose);
switch(chose){
case 0:
break;
case 1:{
scanf("%d",&n);
stu=(Student *)malloc((n+1)*sizeof(Student));
Init_student(stu,n+1);
}
break;
case 2:BubbleSort(stu,n);
break;
case 3:InsetSort(stu,n);
break;
case 4:QuickSort(stu,n);
break;
case 5:SelectSort(stu,n);
break;
case 6:HeapSort(stu,n);
break;
case 7:MergeSort(stu,n);
break;
case 8:
for(j=0;j<n;j++){
printf("%s ",stu[j].num);
printf("%s ",stu[j].name);
printf("%.2f\n",stu[j].score);
}
break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: