gpt4 book ai didi

c - 按特定字段对结构数组进行排序时的冗余

转载 作者:行者123 更新时间:2023-11-30 18:01:30 25 4
gpt4 key购买 nike

我在 c 中有一个“struct Student”数组。

struct student
{
int id;
char *name;
int age;
}

int n = 100; //number of students
struct student s[n] = ...

我有sortByField函数(冒泡排序)来按特定字段的顺序对数组进行排序。

void sortByField(struct student *s, int n, int fieldIndex)
{
int i, j;
for(i=n-1; i>0; i--)
{
for(j=0; j<i; j++)
{
switch (fieldIndex)
{
case 1 : if(s[j].id>s[j+1].id) swapData(&s[i], &s[j+1]); break;
case 2 : if(strcmp(s[j].name, s[j+1].name)>0) swapData(&s[i], &s[j+1]); break;
case 3 : if(s[j].age>s[j+1].age) swapData(&s[i], &s[j+1]); break;
}
}
}
}

例如,如果我将 1 传递给参数fieldIndex

sortByField(s, n, 1);

它将按 id 对数组进行排序。或者,如果我传递 2,它将按名称排序。等等。

正如你所看到的。我在冒泡排序循环中使用 switch-case 来确定要比较或排序的字段。但我不喜欢这样,我认为必须在循环中一次又一次地检查 fieldIndex 的情况是多余的。

我一直在尝试将开关盒移出循环,以便只检查一次,但我已经无计可施了。

最佳答案

void sortById(struct student *s, int n)
{
int i, j;
for(i=n-1; i>0; i--)
for(j=0; j<i; j++)
if(s[j].id>s[j+1].id)
swapData(&s[i], &s[j+1]);

}
void sortByName(struct student *s, int n)
{
int i, j;
for(i=n-1; i>0; i--)
for(j=0; j<i; j++)
if(strcmp(s[j].name, s[j+1].name)>0)
swapData(&s[i], &s[j+1]);

}
void sortByAge(struct student *s, int n)
{
int i, j;
for(i=n-1; i>0; i--)
for(j=0; j<i; j++)
if(s[j].age>s[j+1].age)
swapData(&s[i], &s[j+1]);

}
void sortByField(struct student *s, int n, int fieldIndex)
{
switch (fieldIndex)
{
case 1 : sortById(s, n); break;
case 2 : sortByName(s, n); break;
case 3 : SortByAge(s, n); break;
}
}

但是这个切换没什么大不了的。如果是的话,你应该首先考虑更有效的排序算法......

关于c - 按特定字段对结构数组进行排序时的冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9793592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com