Я вызывал эту функцию несколько раз, чтобы правильно отсортировать элементы в моей структуре записей

#c #loops #sorting

#c #циклы #сортировка

Вопрос:

Я изучаю 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", amp;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(amp;rec[i2], amp;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(amp;rec[i2], amp;rec[j2]);

                }
            }
        }

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

}
 

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

Комментарии:

1. Вы сравниваете разные элементы в каждом цикле сортировки. Неудивительно, что они ведут себя по-разному.

2. Используйте qsort и функцию сравнения. Это то, для чего это было сделано.

3. Смотрите c-faq.com/lib/qsort2.html .

Ответ №1:

вот алгоритм на 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(amp;arr[j], amp;arr[j 1]); 
} 
 

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