C++中按学生平均分对vector降序排序的正确方法咨询
问题分析与解决方案
咱们先看看你这段冒泡排序代码的问题:逻辑刚好搞反了,没法实现你想要的降序排序。你当前的判断条件是if(students[j].average()> students[j+1].average()),然后交换j和j+1的元素——这会把平均分高的学生往后挪,最后得到的是升序结果(平均分从低到高),和你要的降序完全相反。
修正你的冒泡排序代码
要实现降序,只需要把判断条件反过来:当students[j].average()小于students[j+1].average()时交换,这样就能把平均分高的学生往前排。另外还给你加了个小优化(内层循环上限调整),减少不必要的比较:
void sortDes() { int len = students.size(); for(int i = 0; i < len; i++) { for(int j = 0;j < len - 1 - i; j++) { // 每轮后最后i个元素已有序,无需再比较 if(students[j].average() < students[j+1].average()) { // 条件反转 swap(students[j], students[j+1]); } } } }
更推荐的方法:用C++标准库sort函数
自己写冒泡排序不仅容易出错,效率也远不如标准库的sort(标准库sort是快速排序/堆排序的混合实现,时间复杂度O(nlogn),而冒泡是O(n²))。下面给你几种常用的简洁实现方式:
方式1:lambda表达式(最直观简洁)
#include <algorithm> // 必须包含algorithm头文件 void sortDes() { std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.average() > b.average(); // 降序规则:a平均分更高则排在前面 }); }
方式2:自定义比较函数(适合复用逻辑)
如果需要在多个地方用到这个排序规则,可以单独写一个比较函数:
#include <algorithm> bool compareByAverageDesc(const Student& a, const Student& b) { return a.average() > b.average(); } void sortDes() { std::sort(students.begin(), students.end(), compareByAverageDesc); }
方式3:重载运算符配合std::greater(适合频繁比较的场景)
如果你的Student类经常需要按平均分比较,可以重载<运算符,再用std::greater实现降序:
#include <algorithm> #include <functional> // 包含std::greater class Student { // 你的类成员、average()方法... public: bool operator<(const Student& other) const { return this->average() < other.average(); // 定义升序比较规则 } }; void sortDes() { std::sort(students.begin(), students.end(), std::greater<Student>()); }
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

