通过特定字段对结构数组进行排序的冗余

时间:2012-03-20 19:29:44

标签: c sorting refactoring structure

我在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的情况是多余的。

我一直在尝试将开关盒移出循环,以便只检查一次,但我的结束了。

1 个答案:

答案 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;
    }
}

但这种转变不是什么大问题。如果它是你应该首先考虑更有效的排序算法...