我在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的情况是多余的。
我一直在尝试将开关盒移出循环,以便只检查一次,但我的结束了。
答案 0 :(得分:0)
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;
}
}
但这种转变不是什么大问题。如果它是你应该首先考虑更有效的排序算法...