#include #include #include using namespace std;

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;

}

该代码实现了一个患者排序的功能,按照以下规则进行排序:

  1. 如果患者的年龄都大于等于60岁,则按年龄从大到小排序;
  2. 如果患者的年龄有小于60岁的,则年龄小于60岁的排在前面,年龄大于等于60岁的排在后面;
  3. 对于年龄小于60岁的患者,按输入的顺序排序;
  4. 输出排序后的患者ID。

优化后的代码

原始代码存在一些错误,例如:

  1. patient p[9999999];:定义了一个非常大的数组,可能导致栈溢出。使用 vector<patient> p(n); 来代替,可以根据实际需要动态分配内存,避免栈溢出。
  2. sort(p,&p[n],cmp);:排序算法的实现有误。应该是 sort(p.begin(), p.end(), cmp);。
  3. for(int i=1; i<=n; i++):循环的起始条件应该是 i=0,而不是 i=1。因为数组的下标从0开始。
  4. 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,避免多输出一个空行。

结论

通过以上优化,代码可以正确地实现患者排序的功能,同时提高了代码的效率和安全性。

C++ 患者排序算法优化 - 使用 vector 提高效率并修复错误

原文地址: https://www.cveoy.top/t/topic/qCAP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录