输入A组学生姓名和身高,输入B组学生姓名和身高,使用二路归并按照学生身高从低到高排序。然后随机插入一名姓名为李四,身高为1.88M的学生,输出最后的排序。使用链表操作和二路归并完成生成代码
时间: 2024-10-15 15:14:49 浏览: 33
首先,我们需要创建一个结构体或者类来表示学生,包含姓名和身高的属性,并实现相应的比较函数以便于排序。这里假设我们有一个名为`Student`的结构体,它有两个成员变量:`name`和`height`。
```c++
#include <iostream>
#include <vector>
#include <list>
#include <random>
// 学生结构体,包含姓名和身高
struct Student {
std::string name;
double height;
bool operator<(const Student& other) const { // 按照身高升序比较
return height < other.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);
auto it_left = left.begin();
auto it_right = right.begin();
for (auto it = students.begin() + start; it != students.begin() + end; ++it) {
if (it_left == left.end() || (*it_left) < (*it_right)) {
*it = *it_left++;
} else {
*it = *it_right++;
}
}
}
// 二路归并排序整个列表
void mergeSort(std::list<Student>& students, int start, int end) {
if (start < end - 1) {
int mid = (start + end) / 2;
mergeSort(students, start, mid);
mergeSort(students, mid, end);
merge(students, start, mid, end);
}
}
int main() {
// 分别填充A组和B组学生信息
std::list<Student> group_A = {{"张三", 1.70}, {"李明", 1.75}, ...}; // 假设已有的A组学生
std::list<Student> group_B = {{"王五", 1.65}, {"赵六", 1.80}, ...}; // 假设已有的B组学生
// 合并两个组并排序
group_A.splice(group_A.end(), group_B); // 将B组追加到A组末尾
mergeSort(group_A, 0, group_A.size());
// 随机插入李四
static std::mt19937 generator(std::chrono::system_clock::now().time_since_epoch().count());
std::uniform_int_distribution<int> distribution(0, group_A.size()); // 选择插入位置
int insertion_index = distribution(generator);
Student li_six = {"李四", 1.88};
group_A.insert(group_A.begin() + insertion_index, li_six);
// 输出最终排序结果
for (const auto& student : group_A) {
std::cout << "姓名:" << student.name << ", 身高:" << student.height << std::endl;
}
// 相关问题:
阅读全文