c++ 输入A组学生姓名和身高,输入B组学生姓名和身高,使用二路归并按照学生身高从低到高排序。然后随机插入一名姓名为李四,身高为1.88M的学生,输出最后的排序。 (1)使用链表操作和二路归并完成 要求关键代码做好注释
时间: 2024-12-01 20:30:10 浏览: 37
在C++中,你可以使用`std::list`结构体来存储学生的姓名和身高,并利用二路归并排序算法对两个列表合并。由于题目要求使用链表操作和二路归并,这里我将展示如何实现这个过程。首先,我们需要定义一个结构体`Student`来表示学生:
```cpp
#include <iostream>
#include <list>
#include <random>
// 定义学生结构体
struct Student {
std::string name;
double height; // 使用double类型表示身高,单位米
// 默认构造函数
Student() : name(""), height(0) {}
// 根据姓名和身高初始化
explicit Student(const std::string& n, double h) : name(n), height(h) {}
};
// 定义比较函数用于排序
bool compareStudents(Student a, Student b) {
return a.height < b.height;
}
// 二路归并排序
void merge(std::list<Student>& students, int start, int mid, int end) {
// 创建临时列表用于存放左右两部分
std::list<Student> left(students.begin() + start, students.begin() + mid);
std::list<Student> right(students.begin() + mid, students.begin() + end);
// 合并左右两部分
while (!left.empty() && !right.empty()) {
if (compareStudents(left.front(), right.front())) {
students.splice(students.end(), left);
left.pop_front();
} else {
students.splice(students.end(), right);
right.pop_front();
}
}
// 将剩余元素加入到结果列表
if (!left.empty()) {
students.splice(students.end(), left);
}
if (!right.empty()) {
students.splice(students.end(), right);
}
}
// 主函数
int main() {
// 分别输入A组和B组学生信息
std::list<Student> groupA;
std::list<Student> groupB;
for (int i = 0; i < A_SIZE; ++i) { // A_SIZE是你预设的A组学生数量
std::string name;
double height;
std::cin >> name >> height;
groupA.push_back(Student(name, height));
}
for (int i = 0; i < B_SIZE; ++i) { // B_SIZE同理
std::cin >> name >> height;
groupB.push_back(Student(name, height));
}
// 对A组和B组进行排序
merge(groupA, 0, groupA.size() - 1, 0);
merge(groupB, 0, groupB.size() - 1, 0);
// 随机插入李四
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, groupA.size() + groupB.size()); // 调整范围以包括新插入的学生
int insertionIndex = dis(gen);
groupA.splice(insertionIndex, groupA, groupB.begin()); // 插入李四在合适的位置
// 输出排序后的学生列表
for (const auto& student : groupA) {
std::cout << "Name: " << student.name << ", Height: " << student.height << "m\n";
}
阅读全文