排序算法应用
2015-12-16 20:20
465 查看
给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作:
(1)设计一个显示对学生信息操作的菜单函数如下所示:
*************************
1、录入学生基本信息
2、直接插入排序
3、冒泡排序
4、快速排序
5、简单选择排序
6、堆排序
7、2-路归并排序
8、输出学生信息
0、退出
*************************
(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; }
相关文章推荐
- window phone开发链接真机测试的部署流程
- 选错实施顾问公司 ERP项目九死一生
- DGbroker三种保护模式的切换
- CentOS 上php环境搭建
- 支付参考文档
- SharePoint 2013中的默认爬网文件扩展名和分析文件类型
- 跨域WebService请求 ——Nginx+SOAP服务+Ajax客户端
- CSC321 神经网络语言模型 RNN-LSTM
- 基于SOAP的Web服务AJAX客户端
- Promise编程模式中链式调用时传值的一个小坑
- 我的国一之路
- swift语言环境下用storyboard载入页面
- splay 模板
- 【190】修改 PowerShell & CMD 显示字体
- Activity的四个启动模式
- Word2vec 模型载入(tensorflow)
- Word2vec多线程(tensorflow)
- Android中通过typeface设置字体
- keil中code和const的区别
- 开源中最好的Web开发的资源