C ++实现中的气泡数组排序

时间:2018-02-17 18:50:43

标签: c++

我正在尝试使用此代码对名称进行排序,但它似乎对我不起作用。可能有什么不对?我有一个名为Student的类,想要传递名称并按升序对它们进行排序。所以我要做的是将4对象firstname传递给sort_list函数并按升序对它们进行排序并在之后显示它们。但是,当我运行代码时,它向我显示了我的相同顺序,并且sort函数似乎没有做任何事情。看看你们是否可以帮助我。

#include <iostream>
#include<string>
using namespace std;

//***************************************************************************
//STUDENT CLASS
//***************************************************************************
class Student
{
private:
    string firstname;
    string lastname;
    string studentID;
    string phoneNumber;
    double gpa;
public:
    Student();
    Student(const string&, const string&, const string&, const string&, const double&);
    string getfirstName() const;
    string getlastName() const;
    string getstudentId() const;
    string getphoneNumber() const;
    double getGPA() const;
    void setfirstName(string&);
    void setlastName(string&);
    void setstudentId(string&);
    void setphoneNumber(string&);
    void setGAP(double&);   
};

Student::Student()
{
    firstname = " ";
    lastname = " ";
    studentID = " ";
    phoneNumber = " ";
    gpa = 0;
}
Student::Student(const string&a, const string&b, const string&c, const string&d, const double&e)
{
    firstname = a;
    lastname = b;
    studentID = c;
    phoneNumber = d;
    gpa = e;

}
string Student::getfirstName()const
{
    return firstname;
}
string Student::getlastName()const
{
    return lastname;
}
string Student::getstudentId() const
{
    return studentID;
}
string Student::getphoneNumber() const
{
    return phoneNumber;
}
double Student::getGPA() const
{
    return gpa;
}
void Student::setfirstName(string&u)
{
    firstname = u;
}
void Student::setlastName(string&v)
{
    lastname = v;
}
void Student::setstudentId(string&x)
{
    studentID = x;
}
void Student::setphoneNumber(string&y)
{
    phoneNumber = y;
}
void Student::setGAP(double&z)
{
    gpa = z;
}



//***************************************************************************
//COURSE CLASS
//***************************************************************************
class Course :public Student
{
private:
    string code;
    int section;
    int capacity;
    int numStudents;
    Student *list;
public:
    Course();
    Course(string, int, int);
    ~Course();
    string getCourseCode();
    int getSection();
    int getCapacity();
    int getNumStudents();
    void setCourseCode(string);
    void setSection(int);
    void add(const Student&);
    void display();
    void display(const string, const int);
    void remove(const string m, const int n);
    void sort_list();
};
Course::Course()
{
    code = "CMPT1020";
    section = 1;
    capacity = 35;
    numStudents = 0;
    list = new Student[35];
}
Course::Course(string a, int b, int c)
{
    code = a;
    section = b;
    capacity = c;
    numStudents = 0;
    list = new Student[c];
}
Course::~Course()
{
    delete[] list;
    list = nullptr;
}
string Course::getCourseCode()
{
    return code;
}
int Course::getSection()
{
    return section;
}
int Course::getCapacity()
{
    return capacity;
}
int Course::getNumStudents()
{
    return numStudents;
}
void Course::setCourseCode(string a)
{
    code = a;
}
void Course::setSection(int b)
{
    section = b;
}
void Course::add(const Student& s)
{
    if (numStudents == capacity)
    {
        cout << "Course is full" << endl;
        return;
    }
    list[numStudents] = s;
    numStudents++;
    int i = numStudents - 2;
    while (i >= 0 && (s.getGPA() > list[i].getGPA()))
    {
        list[i + 1] = list[i];
        i--;
    }
    list[i + 1] = s;
}
void Course::display()
{
    for (int i = 0; i < numStudents; i++)
    {
        cout<<list[i].getfirstName() <<" "<< list[i].getlastName() <<" "<< list[i].getstudentId() <<" "<< list[i].getphoneNumber() <<" "<< list[i].getGPA() << endl;
    }
}
void Course::display(const string x, const int y)
{
    if (y == 1)
    {
        for (int i = 0; i < numStudents; i++)
        {
            if (list[i].getfirstName() == x)
            {
                cout << list[i].getfirstName() << " " << list[i].getlastName() << " " << list[i].getstudentId() << " " << list[i].getphoneNumber() << " " << list[i].getGPA() << endl;
            }
        }
    }
    if (y == 2)
    {
        for (int i = 0; i < numStudents; i++)
        {
            if (list[i].getlastName() == x)
            {
                cout << list[i].getfirstName() << " " << list[i].getlastName() << " " << list[i].getstudentId() << " " << list[i].getphoneNumber() << " " << list[i].getGPA() << endl;
            }
        }
    }
    if (y == 3)
    {
        for (int i = 0; i < numStudents; i++)
        {
            if (list[i].getstudentId() == x)
            {
                cout << list[i].getfirstName() << " " << list[i].getlastName() << " " << list[i].getstudentId() << " " << list[i].getphoneNumber() << " " << list[i].getGPA() << endl;
            }
        }
    }
    if (y == 4)
    {
        for (int i = 0; i < numStudents; i++)
        {
            if (list[i].getphoneNumber() == x)
            {
                cout << list[i].getfirstName() << " " << list[i].getlastName() << " " << list[i].getstudentId() << " " << list[i].getphoneNumber() << " " << list[i].getGPA() << endl;
            }
        }
    }
}
void Course::remove(const string a, const int b)
{
    if (b == 1)
    {
        for (int i = 0; i < numStudents; i++)
        {
            if (list[i].getfirstName() == a)
            {
                for (int j = i; j < numStudents; j++)
                {
                    list[j] = list[j + 1];

                }
                numStudents--;
            }
        }
    }
    if (b == 2)
    {
        for (int i = 0; i < numStudents; i++)
        {
            if (list[i].getlastName() == a)
            {
                for (int j = i; j < numStudents; j++)
                {
                    list[j] = list[j + 1];

                }
                numStudents--;
            }
        }
    }
    if (b == 3)
    {
        for (int i = 0; i < numStudents; i++)
        {
            if (list[i].getstudentId() == a)
            {
                for (int j = i; j < numStudents; j++)
                {
                    list[j] = list[j + 1];

                }
                numStudents--;
            }
        }
    }
    if (b == 4)
    {
        for (int i = 0; i < numStudents; i++)
        {
            if (list[i].getphoneNumber() == a)
            {
                for (int j = i; j < numStudents; j++)
                {
                    list[j] = list[j + 1];

                }
                numStudents--;
            }
        }
    }
}
void Course::sort_list()
{
    string temp;
    for (int i = 0; i < numStudents; i++)
    {
        for (int j = 0; j < numStudents-1; j++)
        {
            if(list[j].getfirstName() >list[j+1].getfirstName())
            {           
                temp = list[j].getfirstName();
                list[j].getfirstName() = list[j+1].getfirstName();
                list[j+1].getfirstName() = temp;                    
            }               
        }

    }   
}

int main()
{

    Student a("Kevin", "Chen", "300215915", "7788408028", 2);
    Student b("Mickey", "Mouse", "12345678", "2222222222", 2.5);
    Student c("Donald", "Duck", "24681012", "3333333333", 3.0);
    Student d("Goofy", "Dog", "3579111315", "5555555555", 3.5);
    Course x;


    x.add(a);
    x.add(b);
    x.add(c);
    x.add(d);
    x.display();
    cout << endl;
    x.sort_list();
    x.display();



    /*cout << "          " << endl;
    x.remove("kevin", 1);
    x.remove("Chen", 2);
    x.remove("300215915", 3);
    x.remove("7788408028", 4);
    x.display();


    cout << endl;

    x.display("kevin", 1);
    x.display("Mouse", 2);
    x.display("24681012", 3);
    x.display("5555555555", 4);*/

    system("pause");
    return 0;


}

1 个答案:

答案 0 :(得分:0)

您的排序代码确实没有做任何事情。

以下是它的核心:

temp = list[j].getfirstName();
list[j].getfirstName() = list[j+1].getfirstName();
list[j+1].getfirstName() = temp;

getfirstName()按值返回名字,因此您的所有作业都在交换名字的临时副本。对实际的列表元素没有影响。

我认为你的意思是:

temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;

这也意味着temp必须声明为Student,而不是std::string

另外,除非我错误地记录冒泡排序是如何工作的(这肯定是可能的 - 鉴于它在现实世界中的无用性,因为我写了一个时间),你的外表循环需要尽可能多的迭代,因为内循环不再进行任何交换。如果在numStudents次迭代时以某种方式固有上限,我无法看到原因,也无法在the Wikipedia article上看到任何证据。

假设我与之正确,我的功能看起来像这样:

void Course::sort_list()
{
    bool go_again = false;

    do {
        go_again = false;

        for (int i = 0; i < numStudents-1; i++) {
            if (list[i].getfirstName() > list[i+1].getfirstName()) {           
                Student temp = list[i];
                list[i] = list[i+1];
                list[i+1] = temp;                    

                go_again = true;
            }               
        }

    } while(go_again);
}

live demo