#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 30
typedef struct student {
char name[8];
int score;
} Student;
void inputStudents(Student students[], int n);
void printStudents(Student students[], int n);
void selectionSort(Student students[], int n);
void bubbleSort(Student students[], int n);
void quickSort(Student students[], int left, int right);
int partition(Student students[], int left, int right);
void swap(Student *a, Student *b);
void sortMenu(Student students[], int n);
int main() {
Student students[N];
int n;
printf("请输入学生人数(最多%d人):", N);
scanf("%d", &n);
if (n <= 0 || n > N) {
printf("无效的学生人数!\n");
return 1;
}
inputStudents(students, n);
sortMenu(students, n);
printf("\n排序后的学生成绩表:\n");
printf("排名 姓名 成绩\n");
printStudents(students, n);
return 0;
}
void inputStudents(Student students[], int n) {
printf("\n请输入学生成绩信息:\n");
for (int i = 0; i < n; i++) {
printf("学生%d 姓名: ", i + 1);
scanf("%s", students[i].name);
printf(" 成绩: ");
scanf("%d", &students[i].score);
}
}
void printStudents(Student students[], int n) {
for (int i = 0; i < n; i++) {
printf("%4d %s %4d\n", i + 1, students[i].name, students[i].score);
}
}
void selectionSort(Student students[], int n) {
for (int i = 0; i < n - 1; i++) {
int max = i;
for (int j = i + 1; j < n; j++) {
if (students[j].score > students[max].score) {
max = j;
}
}
if (max != i) {
swap(&students[max], &students[i]);
}
}
}
void bubbleSort(Student students[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (students[j].score < students[j + 1].score) {
swap(&students[j], &students[j + 1]);
}
}
}
}
void quickSort(Student students[], int left, int right) {
if (left < right) {
int pivot = partition(students, left, right);
quickSort(students, left, pivot - 1);
quickSort(students, pivot + 1, right);
}
}
int partition(Student students[], int left, int right) {
Student pivot = students[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (students[j].score >= pivot.score) {
i++;
swap(&students[i], &students[j]);
}
}
swap(&students[i + 1], &students[right]);
return i + 1;
}
void swap(Student *a, Student *b) {
Student temp = *a;
*a = *b;
*b = temp;
}
void sortMenu(Student students[], int n) {
int choice;
printf("\n请选择排序算法:\n");
printf("1. 选择排序\n");
printf("2. 冒泡排序\n");
printf("3. 快速排序\n");
printf("请输入选择(1-3):");
scanf("%d", &choice);
switch (choice) {
case 1:
selectionSort(students, n);
printf("已使用选择排序算法\n");
break;
case 2:
bubbleSort(students, n);
printf("已使用冒泡排序算法\n");
break;
case 3:
quickSort(students, 0, n - 1);
printf("已使用快速排序算法\n");
break;
default:
printf("无效选择,默认使用选择排序\n");
selectionSort(students, n);
break;
}
}