Сортировка 2D Char и Int Array из класса с помощью пузырьковой сортировки?

Я пытаюсь отсортировать массив int а также charс (из класса) в порядке убывания. Это имена и оценки учеников.

Класс определяется как:

class Student {
public:
char name[20];
int grades;
};

numCount это инкрементное значение количества записей.

void bubble_sort(Student theResults[], int numCount)
{
bool swapped = true;
while(swapped)
{
swapped = false;
for(int i=1;i<numCount;i++)
{
if(theResults[i-1].grades < theResults[i].grades)
{
int tempHold = theResults[i-1].grades;
theResults[i-1].grades = theResults[i].grades;
theResults[i].grades = tempHold;
swapped = true;
}
}
}

У меня проблема в том, что int значения (оценки) сортируются правильно после цикла, но возникают трудности с правильным распределением имен в соответствии с оценками.

Я использовал следующий код, но он не работает, так как отображает неверные оценки для студентов.

char* title_temp = theResults[i-1].name;
theResults[i-1].name[20] = theResults[i].name[20];
theResults[i].name[20] = title_temp[20];

0

Решение

Я думаю, что ваша проблема здесь:

if(theResults[i-1].grades < theResults[i].grades)
{
int tempHold = theResults[i-1].grades;

theResults[i-1].grades = theResults[i].grades;

theResults[i].grades = tempHold;

swapped = true;
}

То, что вы действительно хотите сделать, это

if(theResults[i-1].grades < theResults[i].grades)
{
Student tempHold = theResults[i-1];

theResults[i-1] = theResults[i];

theResults[i] = tempHold;

swapped = true;
}

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

1

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

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

Вы также можете использовать мелкую копию вашего класса

void bubble_sort(Student theResults[], int numCount)
{bool swapped = true;
while(swapped)
{
swapped = false;
for(int i=1;i<numCount;i++)
{
if(theResults[i-1].grades < theResults[i].grades)
{
Student tempHold = theResults[i-1];

theResults[i-1]= theResults[i];

theResults[i] = tempHold;

swapped = true;
}
}
}
}
1

Проблема в том, что вам нужно поменять местами объекты, оценки должны действовать только как ключ чтобы провести сортировку, попробуйте это:

void bubble_sort(Student theResults[], int numCount)
{

Student tempHold;
bool swapped = true;
while(swapped)
{
swapped = false;
for(int i=1;i<numCount;i++)
{
if(theResults[i-1].grades < theResults[i].grades)
{
tempHold = theResults[i-1]; //swap the objects, not just the grades.

theResults[i-1]= theResults[i];

theResults[i] = tempHold;

swapped = true;
}
}
}}

Однако если вам необходимо скопировать участников, то в дополнение к обмену оценками:

char temp[20];
strcpy(temp ,theResults[i-1].name);
strcpy(theResults[i-1].name,theResults[i].name);
strcpy(theResults[i].name,temp);

Вместо того, чтобы использовать

    char* title_temp = theResults[i-1].name; // <-wrong
theResults[i-1].name[20] = theResults[i].name[20];//20 is invalid index
theResults[i].name[20] = title_temp[20]; //this is just 1 element out of the whole array

что неправильно из-за много причины.

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