Bubble Sort — Массив структур с массивом структур

Как отсортировать два массива структур (один из массивов является членом другой структуры) с помощью одной и той же функции с использованием пузырьковой сортировки (в порядке убывания для студентов [] в Student :: name и отсортировать массив classes [] в Class ::заглавие?

struct Class
{
string title;
int units;
char grade;

};
struct Student
{
string name;
double gpa;
Class classes[500];
};

В основном:

Student students[SIZE];

Я пытаюсь отсортировать массив структур, каждый из которых содержит массив структур, которые также должны быть отсортированы с использованием пузырьковой сортировки. Моя функция сортировки вставлена ​​ниже. Он не сортирует правильно, а сортирует внутренний массив классов struct [] в соответствии с заголовком и корректно сортирует внешний массив st [] на первой итерации цикла for. Так как на второй итерации элементы st [] были поменяны местами, первый элемент не сортируется, потому что currentStu теперь устанавливается на второй элемент в массиве.

void sort_name(Student st[], int numValues)
{
int currentStu = 0;
int currentClass = 0;

for(currentStu = 0; currentStu < numValues; currentStu++)
{
for(currentClass = 0; st[currentStu].classes[currentClass].title != ""; currentClass++)
{
bubbleUpClass(st, currentClass, currentStu);
}

bubbleUpLastName(st, currentStu, numValues - 1);
}
}

1

Решение

На самом деле у вас нет двухмерного массива студентов, что (в целом) хорошо. Вам необходимо применить два отдельных процесса сортировки, и они могут применяться совершенно независимо.

  1. Вам нужно перебрать свой список учащихся, отсортировав каждый из списков классов (по одному на каждого учащегося). Непонятно, как вы узнаете, сколько уроков посещает данный студент, но это проблема, которую вы должны решить. Вы можете сделать это до или после (но не во время) другой операции сортировки. Это легко распараллелить, если это было интересно; Вы можете разделить список учеников на N тем, предоставив каждому потоку подходящий набор учеников для работы.

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

Вам понадобятся две отдельные функции сортировки — или, если вы позаимствуете дизайн стандартной функции C qsort()Вы получите две отдельные функции сравнения и один алгоритм сортировки.

Поэтому не пытайтесь объединить две операции сортировки. Делай их отдельно.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]