VS Studio学生注册系统:快速排序实现字母序排序失败求助
学生注册系统排序功能修复指南
问题描述
我正在完成数据结构与算法课程的学生注册系统项目,大部分功能已实现,仅剩按字母顺序排序学生数据的功能无法正常工作。需求是:当用户选择选项3时,将学生的姓名、身份证号(icno)、学号(matric number)、院系信息按字母顺序排序(例如让“Alex”排在首位)。使用VS Studio开发,编写的代码如下,但运行异常:
void Student::quickSort(string &x,int left, int right) { int j = right; int i = left; int mid = x [(left + right) / 2]; while (i <= j) { while (x[i] < mid) i++; while (x[j] > mid) j--; if (i <= j) { swap(x[i], x[j]); i++; j--; } }; if (left < j) quickSort(x, left, j); if (i < right) quickSort(x, i , right); displayStudent(); } void Student::studentName(string x) { x = name[size]; quickSort(x, 0, x.size() - 1); }
代码核心问题
- 排序对象完全错误:当前
quickSort函数是对单个字符串的字符进行排序(比如把"Alex"变成"Aelx"),而不是对整个学生列表按姓名(或其他字段)排序。你传入的x = name[size]只是单个学生的姓名,而且size作为索引大概率越界(数组最后一个元素索引是size-1)。 - 参数传递无效:
studentName的参数x是值传递,修改局部变量不会影响原数组的学生数据。 - 递归逻辑混乱:每次递归
quickSort结束都调用displayStudent,会导致排序未完成就重复输出,且输出的是单个学生而非全部排序后的列表。 - 类型不匹配:
mid被定义为int,但实际是取字符串的单个字符,应该用char类型。
修正方案
要实现学生数据按字母排序,需要对存储所有学生的数组/容器进行排序,而非单个字符串。以下是可运行的修正代码:
1. 前提假设
假设你的Student类中包含:
- 存储所有学生的数组:
Student students[MAX_STUDENTS];(或用vector<Student>更灵活) - 记录当前学生数量的变量:
int studentCount; - 学生属性:
string name, icno, matricNo, department;
2. 修正后的快速排序函数
// 按姓名对学生数组进行快速排序 void Student::quickSort(Student students[], int left, int right) { if (left >= right) return; // 选取中间位置学生的姓名作为基准 string pivot = students[(left + right) / 2].name; int i = left, j = right; while (i <= j) { // 找到比基准姓名小的学生 while (students[i].name < pivot) i++; // 找到比基准姓名大的学生 while (students[j].name > pivot) j--; if (i <= j) { // 交换两个学生的所有信息,保证关联字段同步 swap(students[i], students[j]); i++; j--; } } // 递归排序左右子数组 if (left < j) quickSort(students, left, j); if (i < right) quickSort(students, i, right); } // 触发排序并显示全部学生的函数 void Student::sortAndDisplayStudents() { // 对0到studentCount-1索引的学生排序 quickSort(students, 0, studentCount - 1); // 排序完成后统一显示所有学生 displayAllStudents(); }
3. 关键修改说明
- 排序对象改为学生数组,交换整个
Student对象,确保姓名、身份证号等所有信息一起排序。 - 直接利用C++字符串的比较运算符(
</>)实现字母顺序对比,无需手动处理字符排序。 - 排序完成后再调用
displayAllStudents()(需你实现该函数遍历所有学生输出),避免中途重复输出。 - 修复索引越界问题,用
studentCount - 1作为数组最后一个元素的索引。
4. 扩展到其他字段排序
如果需要按身份证号、学号或院系排序,只需修改基准值和比较的字段即可。例如按院系排序:
string pivot = students[(left + right) / 2].department; while (students[i].department < pivot) i++; while (students[j].department > pivot) j--;
内容的提问来源于stack exchange,提问作者Muhammad Haziq
相关产品推荐
相关产品推荐

