简体   繁体   中英

Sorting a 2D Char and Int Array from class using bubble sort?

I am trying to sort an array of int and char s (from a class) by descending order. These are student names and grades.

The class is defined as:

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

numCount is the incremental value of number of records.

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;
      }
    }
  }

The issue I am having is that the int values (grades) are sorted correctly after the loop but having difficulty getting the names to be correctly allocated to match with the grades.

I have used the following code but it doesn't work as it displays the incorrect grades for the students.

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

The problem is that you need to swap the objects , the grades only have to act as a key to guide the sort, try this :

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;
            }
        }
    }}

However, if you must copy members, then in addition to swapping grades :

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

Instead of using

    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

which is wrong due to many reasons.

You'd have to copy the entire char block, each element at a time using a loop, or you could use memcpy.

You could also use a shallow copy of your class

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;
            }
        }
    }
}

I think your problem is here:

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;
}

What you really want to do is

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

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

    theResults[i] = tempHold;

    swapped = true;
}

Before all you were changing was the grade value and not the names, this will switch the entire Student object and should produce the output you are looking for

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM