#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]);
}
приведенный выше алгоритм взят из: пузырьковая сортировка