Я вызывал эту функцию несколько раз, чтобы правильно отсортировать элементы в моей структуре записей - PullRequest
0 голосов
/ 19 апреля 2019

Я изучаю C и пишу основную программу для хранения записей. Когда я пытаюсь отсортировать элементы в моем массиве структур (я не знаю, правильно ли я это сказал) в алфавитном порядке по фамилии, я обнаруживаю, что мне приходится вызывать функцию несколько раз, чтобы она фактически сортировала все элементы ,

Я полагаю, что проблема в ret = strcmp (rec [j2] .lastname, rec [j2 + 1] .lastname); и где это в коде. Он запускается один раз и сортирует два элемента в массиве, но мне приходится вызывать функцию несколько раз, чтобы она полностью сортировалась. Я попытался поместить эту строку в свой цикл for () и цикл while (), но пока не нашел решения.

 typedef struct rec {
    int recordnumber;
    char firstname[20];
    char lastname[20];
    int age;
    char gender;
} record; 

void SortArr(record* rec, int numrecsread) 
{ 
    int sortchoice;
    int i2, j2, temp, ret;
    record *r1, *r2;
    record trec;

    printf("Press 1 to sort by record number or press 2 to sort by last name.\n");
    scanf("%d", &sortchoice);


    if (sortchoice == 1)
    {
        printf("You have chosen to sort record numbers in ascending order...\n");
        for (i2 = 1; i2 < numrecsread; i2++)
        {
            for (j2 = 0; j2 < numrecsread - 1; j2++)
            {
                if (rec[j2].recordnumber > rec[i2].recordnumber)
                {
                    Swap(&rec[i2], &rec[j2]);

                }
            }
        }
    }
    else if (sortchoice == 2) 
    { 
        printf("You have chosen to sort last names alphabetically...\n");

        for (i2 = 1; i2 < numrecsread; i2++)
        {
            for (j2 = 0; j2 < numrecsread - 1; j2++)
            {
                ret = strcmp(rec[j2].lastname, rec[j2 + 1].lastname); //this has to be called multiple times to fully sort
                if (ret > 0)
                {

                    Swap(&rec[i2], &rec[j2]);

                }
            }
        }

    }
    else if (sortchoice < 1 || sortchoice > 2)
    {
        printf("Invalid input.\n");
    }

}

Прямо сейчас у меня есть четыре записи, хранящиеся в моем массиве обратно в main. Ожидаемый результат состоит в том, что они сортируются в алфавитном порядке по фамилии всего за один вызов функции. Сортировка по номеру записи работает нормально.

1 Ответ

0 голосов
/ 19 апреля 2019

здесь представлен алгоритм c для "пузырьковой" сортировки.

Обратите внимание на резкие различия между размещенным кодом и алгоритмом пузырьковой сортировки.

Примечание: существует множество других алгоритмов сортировки, но опубликованный код OPs не является одним из них.

// A function to implement bubble sort 
void bubbleSort(int arr[], int n) 
{ 
   int i, j; 
   for (i = 0; i < n-1; i++)       

       // Last i elements are already in place    
       for (j = 0; j < n-i-1; j++)  
           if (arr[j] > arr[j+1]) 
              swap(&arr[j], &arr[j+1]); 
} 

вышеуказанный алгоритм от: пузырьковая сортировка

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