Я пытаюсь отсортировать массив 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];
Я думаю, что ваша проблема здесь:
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 и должно выдать искомый результат.
Вам придется скопировать весь блок символов, каждый элемент за раз, используя цикл, или вы можете использовать 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;
}
}
}
}
Проблема в том, что вам нужно поменять местами объекты, оценки должны действовать только как ключ чтобы провести сортировку, попробуйте это:
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
что неправильно из-за много причины.