C++ 患者排序算法优化 - 使用 vector 提高效率并修复错误
#include
struct patient { string id; int age; int ord; };
bool cmp(patient a, patient b) { if (a.age >= 60 && b.age >= 60) { return a.age > b.age; } else if (a.age >= 60 && b.age < 60) { return true; } else if (a.age < 60 && b.age >= 60) { return false; } else // if(a.age<60&&b.age<60) { return a.ord < b.ord; } }
int main() { int n; cin >> n;
vector<patient> p(n);
for (int i = 0; i < n; i++)
{
cin >> p[i].id >> p[i].age;
p[i].ord = i;
}
sort(p.begin(), p.end(), cmp);
for (int i = 0; i < n; i++)
{
cout << p[i].id << '\n';
}
return 0;
}
该代码实现了一个患者排序的功能,按照以下规则进行排序:
- 如果患者的年龄都大于等于60岁,则按年龄从大到小排序;
- 如果患者的年龄有小于60岁的,则年龄小于60岁的排在前面,年龄大于等于60岁的排在后面;
- 对于年龄小于60岁的患者,按输入的顺序排序;
- 输出排序后的患者ID。
优化后的代码
原始代码存在一些错误,例如:
patient p[9999999];:定义了一个非常大的数组,可能导致栈溢出。使用vector<patient> p(n);来代替,可以根据实际需要动态分配内存,避免栈溢出。sort(p,&p[n],cmp);:排序算法的实现有误。应该是sort(p.begin(), p.end(), cmp);。for(int i=1; i<=n; i++):循环的起始条件应该是i=0,而不是i=1。因为数组的下标从0开始。cout<<p[i].id<<endl;:输出患者ID时会多输出一个空行。可以使用cout<<p[i].id<<' ';来避免。
代码分析
- 使用
vector<patient> p(n);定义一个动态数组,可以根据实际需要动态分配内存,避免栈溢出。 - 使用
sort(p.begin(), p.end(), cmp);正确地使用sort函数对vector进行排序。 - 循环遍历
vector时,从下标 0 开始,使用for (int i = 0; i < n; i++)。 - 使用
cout << p[i].id << '\n';来输出患者 ID,避免多输出一个空行。
结论
通过以上优化,代码可以正确地实现患者排序的功能,同时提高了代码的效率和安全性。
原文地址: https://www.cveoy.top/t/topic/qCAP 著作权归作者所有。请勿转载和采集!