c++源代码带注释创建本班的学生名单,并记录本班数据结构课程的成绩,分别使用以下排序方法对此成绩单进行排序: (1)折半插入法对成绩分别进行从高到底和从低到高排序。 (2)快速排序法对成绩分别进行从高到底和从低到高排序。 (3)简单选择排序法对成绩分别进行从高到底和从低到高排序。
时间: 2024-03-18 09:43:22 浏览: 104
以下是一个使用C++语言编写的程序,可以实现创建本班学生名单并记录数据结构课程成绩,并使用折半插入法、快速排序法和简单选择排序法对成绩进行排序:
```c++
#include <iostream>
#include <string>
using namespace std;
// 定义学生结构体
struct Student {
string name; // 学生姓名
int score; // 学生分数
};
// 折半插入排序(从高到低)
void binaryInsertionSortDesc(Student arr[], int n) {
for (int i = 1; i < n; i++) {
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 binaryInsertionSortAsc(Student arr[], int n) {
for (int i = 1; i < n; i++) {
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 quickSortDesc(Student arr[], int left, int right) {
if (left >= right) {
return;
}
Student pivot = arr[left];
int i = left, j = right;
while (i < j) {
while (i < j && arr[j].score <= pivot.score) {
j--;
}
arr[i] = arr[j];
while (i < j && arr[i].score >= pivot.score) {
i++;
}
arr[j] = arr[i];
}
arr[i] = pivot;
quickSortDesc(arr, left, i - 1);
quickSortDesc(arr, i + 1, right);
}
// 快速排序(从低到高)
void quickSortAsc(Student arr[], int left, int right) {
if (left >= right) {
return;
}
Student pivot = arr[left];
int i = left, j = right;
while (i < j) {
while (i < j && arr[j].score >= pivot.score) {
j--;
}
arr[i] = arr[j];
while (i < j && arr[i].score <= pivot.score) {
i++;
}
arr[j] = arr[i];
}
arr[i] = pivot;
quickSortAsc(arr, left, i - 1);
quickSortAsc(arr, i + 1, right);
}
// 简单选择排序(从高到低)
void selectionSortDesc(Student arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int maxIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j].score > arr[maxIndex].score) {
maxIndex = j;
}
}
if (maxIndex != i) {
Student temp = arr[i];
arr[i] = arr[maxIndex];
arr[maxIndex] = temp;
}
}
}
// 简单选择排序(从低到高)
void selectionSortAsc(Student arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j].score < arr[minIndex].score) {
minIndex = j;
}
}
if (minIndex != i) {
Student temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
int main() {
int n;
cout << "请输入学生人数:";
cin >> n;
Student* students = new Student[n];
for (int i = 0; i < n; i++) {
cout << "请输入第" << i + 1 << "个学生的姓名和成绩:";
cin >> students[i].name >> students[i].score;
}
cout << endl;
// 折半插入排序(从高到低)
binaryInsertionSortDesc(students, n);
cout << "折半插入法排序(从高到低)结果为:" << endl;
for (int i = 0; i < n; i++) {
cout << students[i].name << " " << students[i].score << endl;
}
cout << endl;
// 折半插入排序(从低到高)
binaryInsertionSortAsc(students, n);
cout << "折半插入法排序(从低到高)结果为:" << endl;
for (int i = 0; i < n; i++) {
cout << students[i].name << " " << students[i].score << endl;
}
cout << endl;
// 快速排序(从高到低)
quickSortDesc(students, 0, n - 1);
cout << "快速排序(从高到低)结果为:" << endl;
for (int i = 0; i < n; i++) {
cout << students[i].name << " " << students[i].score << endl;
}
cout << endl;
// 快速排序(从低到高)
quickSortAsc(students, 0, n - 1);
cout << "快速排序(从低到高)结果为:" << endl;
for (int i = 0; i < n; i++) {
cout << students[i].name << " " << students[i].score << endl;
}
cout << endl;
// 简单选择排序(从高到低)
selectionSortDesc(students, n);
cout << "简单选择排序(从高到低)结果为:" << endl;
for (int i = 0; i < n; i++) {
cout << students[i].name << " " << students[i].score << endl;
}
cout << endl;
// 简单选择排序(从低到高)
selectionSortAsc(students, n);
cout << "简单选择排序(从低到高)结果为:" << endl;
for (int i = 0; i < n; i++) {
cout << students[i].name << " " << students[i].score << endl;
}
cout << endl;
delete[] students;
return 0;
}
```
在这个程序中,我们首先定义了一个 `Student` 结构体来表示学生,包含学生的姓名和成绩两个属性。然后,我们使用动态内存分配的方式创建一个长度为 `n` 的 `Student` 类型数组,用于存储每个学生的信息。
在输入每个学生的信息后,我们分别调用了折半插入排序、快速排序和简单选择排序三个排序方法,对学生的成绩进行排序。其中,每个排序方法都包含两个函数,分别用于从高到低和从低到高排序。
最后,我们输出了每个排序方法的结果,并在程序结束前释放了之前分配的内存。
阅读全文