【实验内容】
- 编程实现插入排序算法;
- 编程实现快速排序算法;
- 编程实现选择排序算法;
- 编程实现归并排序算法。
【实验步骤】
一、用C语言编程实现插入排序算法
给出n个学生的考试成绩表,每条信息由姓名与分数组成,用一种插入排序算法编程实现:
- 按分数高低次序输出每个学生在考试中获得的名次,分数相同的为同一名次;
- 按名次列出每个学生的姓名与分数。
二、用C语言编程实现快速排序算法
给出n个学生的考试成绩表,每条信息由姓名与分数组成,用一种快速排序算法编程实现:
- 按分数高低次序输出每个学生在考试中获得的名次,分数相同的为同一名次;
- 按名次列出每个学生的姓名与分数。
三、用C语言编程实现选择排序算法
给出n个学生的考试成绩表,每条信息由姓名与分数组成,用一种选择排序算法编程实现:
- 按分数高低次序输出每个学生在考试中获得的名次,分数相同的为同一名次;
- 按名次列出每个学生的姓名与分数。
四、用C语言编程实现归并排序算法
给出n个学生的考试成绩表,每条信息由姓名与分数组成,用归并排序算法编程实现:
- 按分数高低次序输出每个学生在考试中获得的名次,分数相同的为同一名次;
- 按名次列出每个学生的姓名与分数。
代码
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
const int maxn=1e6+5;
struct node{
char name[10]; //姓名
int score; //分数
}student[maxn];
int mune(){ //菜单函数
int i;
printf(" --------主菜单--------\n");
printf(" * 1->成绩录入 * \n");
printf(" * 2->插入排序 * \n");
printf(" * 3->选择排序 * \n");
printf(" * 4->快速排序 * \n");
printf(" * 5->归并排序 * \n");
printf(" * 6->退出系统 * \n");
printf("请选择:");
scanf("%d",&i);
return i;
}
int init(int n){ //成绩录入
printf("请输入学生人数\n");
scanf("%d",&n);
for(int i=1;i<=n;i++){
printf("输入第%d名同学的姓名和分数,用空格隔开\n",i);
scanf("%s%d",&student[i].name,&student[i].score);
}
return n;
}
void show(int n){
if(n==0){
printf("无成绩信息,请先录入成绩表\n");
return;
}
printf("选择输出方式\n");
printf("1:按分数高低次序输出每个学生在考试中获得的名次,分数相同的为同一名次\n");
printf("2:按名次列出每个学生的姓名与分数\n");
int k;
scanf("%d",&k);
int cnt=1;
switch(k){
case 1:
for(int i=1;i<=n;i++){
printf("%s %d\n",student[i].name,cnt);
if(student[i].score!=student[i+1].score) cnt++;
}
break;
case 2:
for(int i=1;i<=n;i++){
printf("%s %d\n",student[i].name,student[i].score);
}
break;
default: printf("输入错误\n");break;
}
}
void Insertion_Sort(int n){ //插入排序
int i,j;
for(i=1;i<=n;i++){
node temp=student[i];
for(j=i;j>1&&student[j-1].score<temp.score;--j)
student[j]=student[j-1];
student[j]=temp;
}
}
void choice_sort(int n){ //选择排序
node temp;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(student[i].score<student[j].score){
temp=student[i];
student[i]=student[j];
student[j]=temp;
}
}
}
}
void quick_sort(int l,int r){ //快速排序
if(l < r){
int i=l,j=r;
node s=student[l];
while(i<j){
while(i<j&&student[j].score<=s.score)
j--;
if(i<j)
student[i++]=student[j];
while(i<j && student[i].score>=s.score)
i++;
if(i<j)
student[j--]=student[i];
}
student[i]=s;
quick_sort(l,i-1);
quick_sort(i+1,r);
}
}
void merge(int low, int mid, int high){
int i, k;
node *tmp = (node *)malloc((high-low+1)*sizeof(node));
int left_low = low;
int left_high = mid;
int right_low = mid + 1;
int right_high = high;
for(k=0; left_low<=left_high && right_low<=right_high; k++){
if(student[left_low].score>=student[right_low].score){
tmp[k] = student[left_low++];
}else{
tmp[k] = student[right_low++];
}
}
if(left_low <= left_high){ //若第一个序列有剩余,直接复制出来粘到合并序列尾
for(i=left_low;i<=left_high;i++)
tmp[k++] = student[i];
}
if(right_low <= right_high){
//若第二个序列有剩余,直接复制出来粘到合并序列尾
for(i=right_low; i<=right_high; i++)
tmp[k++] = student[i];
}
for(i=0; i<high-low+1; i++)
student[low+i] = tmp[i];
free(tmp);
return;
}
void merge_sort(int first,int last){ //归并排序
int mid = 0;
if(first<last){
mid = (first+last)/2;
merge_sort(first, mid);
merge_sort(mid+1,last);
merge(first,mid,last);
}
return;
}
int main(){
int n=0; //学生数量
while(1){
int i,j;
i=mune();
switch(i) {
case 1:n=init(n);system("cls"); break;
case 2:Insertion_Sort(n);show(n); getch();system("cls"); break;
case 3:choice_sort(n);show(n); getch();system("cls"); break;
case 4:quick_sort(1,n);show(n); getch(); system("cls");break;
case 5:merge_sort(1,n);show(n); getch();system("cls"); break;
case 6:exit(0);
default: printf("输入错误\n");getch();system("cls"); break;
}
}
}