Избыточность при сортировке массива структуры по конкретному полю - PullRequest
0 голосов
/ 20 марта 2012

У меня есть массив 'struct student' в c.

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

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

И у меня есть функция sortByField (Bubble sort) для сортировки массива в порядке определенного поля.

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, он будет сортировать по имени.И так далее.

Так же, как вы видели.Я использовал переключатель в цикле пузырьковой сортировки, чтобы определить, какое поле будет сравнивать или сортировать.Но мне это не нравится, я думаю, что это избыточно, чтобы снова и снова проверять случаи fieldIndex в цикле.

Я пытался переместить коммутатор из цикла дляэто нужно проверить только один раз, но я нахожусь в конце моего ума.

1 Ответ

0 голосов
/ 20 марта 2012
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;
    }
}

Но этот переключатель не имеет большого значения. И если это так, вы должны сначала рассмотреть более эффективный алгоритм сортировки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...