C++用结构体类型描述排序表的存储结构,设计一个菜单操作界面,实现录入学生基本信息,按分数从高到低排序,直接插入排序,折半插入排序,冒泡排序,快速排序,简单选择排序,输出学生信息,退出等基本操作
时间: 2023-12-09 15:06:52 浏览: 74
好的,我可以帮你回答这个问题。以下是示例代码:
```c++
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// 定义学生结构体
struct Student {
string name; // 姓名
int score; // 分数
};
// 直接插入排序
void insertSort(Student arr[], int n) {
for (int i = 1; i < n; i++) {
if (arr[i].score > arr[i-1].score) {
Student temp = arr[i];
int j = i - 1;
while (j >= 0 && arr[j].score < temp.score) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
}
}
// 折半插入排序
void binaryInsertSort(Student arr[], int n) {
for (int i = 1; i < n; i++) {
if (arr[i].score > arr[i-1].score) {
Student temp = arr[i];
int left = 0, right = i-1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid].score < temp.score) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (int j = i-1; j >= left; j--) {
arr[j+1] = arr[j];
}
arr[left] = temp;
}
}
}
// 冒泡排序
void bubbleSort(Student arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j].score < arr[j+1].score) {
swap(arr[j], arr[j+1]);
}
}
}
}
// 快速排序
int partition(Student arr[], int left, int right) {
int pivot = arr[right].score;
int i = left - 1;
for (int j = left; j < right; j++) {
if (arr[j].score >= pivot) {
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i+1], arr[right]);
return i+1;
}
void quickSort(Student arr[], int left, int right) {
if (left < right) {
int pivot = partition(arr, left, right);
quickSort(arr, left, pivot-1);
quickSort(arr, pivot+1, right);
}
}
// 简单选择排序
void selectSort(Student arr[], int n) {
for (int i = 0; i < n-1; i++) {
int maxIdx = i;
for (int j = i+1; j < n; j++) {
if (arr[j].score > arr[maxIdx].score) {
maxIdx = j;
}
}
if (maxIdx != i) {
swap(arr[i], arr[maxIdx]);
}
}
}
// 输出学生信息
void printStudents(Student arr[], int n) {
for (int i = 0; i < n; i++) {
cout << "姓名:" << arr[i].name << "\t分数:" << arr[i].score << endl;
}
}
int main() {
const int MAX_SIZE = 100;
Student arr[MAX_SIZE];
int n = 0;
int choice = 0;
while (true) {
cout << "============== 学生信息管理系统 ==============" << endl;
cout << "1. 录入学生信息" << endl;
cout << "2. 按分数从高到低排序(直接插入排序)" << endl;
cout << "3. 按分数从高到低排序(折半插入排序)" << endl;
cout << "4. 按分数从高到低排序(冒泡排序)" << endl;
cout << "5. 按分数从高到低排序(快速排序)" << endl;
cout << "6. 按分数从高到低排序(简单选择排序)" << endl;
cout << "7. 输出学生信息" << endl;
cout << "8. 退出" << endl;
cout << "=============================================" << endl;
cout << "请输入操作选项:";
cin >> choice;
switch (choice) {
case 1: {
if (n == MAX_SIZE) {
cout << "已达到最大容量,无法继续录入!" << endl;
} else {
string name;
int score;
cout << "请输入学生姓名:";
cin >> name;
cout << "请输入学生成绩:";
cin >> score;
arr[n].name = name;
arr[n].score = score;
n++;
cout << "录入成功!" << endl;
}
break;
}
case 2: {
insertSort(arr, n);
cout << "排序完成!" << endl;
break;
}
case 3: {
binaryInsertSort(arr, n);
cout << "排序完成!" << endl;
break;
}
case 4: {
bubbleSort(arr, n);
cout << "排序完成!" << endl;
break;
}
case 5: {
quickSort(arr, 0, n-1);
cout << "排序完成!" << endl;
break;
}
case 6: {
selectSort(arr, n);
cout << "排序完成!" << endl;
break;
}
case 7: {
printStudents(arr, n);
break;
}
case 8: {
cout << "感谢使用学生信息管理系统!" << endl;
return 0;
}
default: {
cout << "无效的操作选项,请重新输入!" << endl;
break;
}
}
}
return 0;
}
```
以上代码是一个简单的学生信息管理系统,可以通过菜单操作界面录入学生基本信息,实现按分数从高到低排序,支持直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序,输出学生信息和退出等基本操作。
阅读全文