C++ C++;使用字符串数组进行快速排序

C++ C++;使用字符串数组进行快速排序,c++,quicksort,C++,Quicksort,我的快速排序代码有问题。我不知道为什么,但它不排序 我的节目 #include <iostream> #include <string> using namespace std; class Student { public: string studentArray[100][3]; string getName(); string getSurname(); string getID(); void setName(s

我的快速排序代码有问题。我不知道为什么,但它不排序

我的节目

#include <iostream>
#include <string>

using namespace std;

class Student
{
    public:
    string studentArray[100][3];
    string getName();
    string getSurname();
    string getID();
    void setName(string stdName);
    void setSurname(string stdSurname);
    void setID(string stdIDs);
    private:
    string name;
    string surname;
    string ID;
};

int quick_sort_help(string &text,int left, int right)
{
    char val = text[right];
    char temp;

    int j = right;
    int i = left - 1;

    while (true)
    {
        while (text[++i] < val);

        while (text[--j] > val) {
            if(j == left)
                break;
        }

        if(i >= j)
            break;

        temp=text[i];
        text[i]=text[j];
        text[j]=temp;
    }

    temp=text[i];
    text[i]=text[right];
    text[right]=temp;

    return i;
}

void quicksort(string &text,int left, int right)
{
    if (left < right)
    {
        int pivot = quick_sort_help(text, left, right);
        quicksort(text, left, pivot - 1);
        quicksort(text, pivot + 1, right);
    }
}

void quick_sort(string &text,int size){
    quicksort(text,0,size-1);
}

int main()
{
    Student myStudent;
    string name;
    string surname;
    string id;
    int choice;
    int temp=0;
    char ans1;
    do{
        cout<<"What do you want to search with"<<endl;
        cout<<"1-)For adding a Student:"<<endl;
        cout<<"2-)Search with name:"<<endl;
        cout<<"3-)Search with surname:"<<endl;
        cout<<"4-)Search with ID (binary!):"<<endl;
        cout<<"5-)Show List!"<<endl;
        cin>>choice;

        switch (choice)
        {
            case 1:
            {
                char ans;
                do
                {
                    cout<<"Please enter Student's name: ";
                    cin>>name;
                    cout<<"Please enter Student's surname: ";
                    cin>>surname;
                    cout<<"Please enter Student's ID: ";
                    cin>>id;
                    myStudent.setName(name);
                    myStudent.setSurname(surname);
                    myStudent.setID(id);

                    myStudent.studentArray[temp][0]=myStudent.getID();
                    myStudent.studentArray[temp][1]=myStudent.getName();
                    myStudent.studentArray[temp][2]=myStudent.getSurname();
                    cout<<"Want to add new Student? (y/Y)";
                    cin>>ans;
                    temp++;
                }while(ans=='y'||ans=='Y');
                break;
            }
            case 2:
            {
                cout<<"Enter the student name:";
                cin>>name;
                for(int i=0;i<temp;i++)
                {
                    if(myStudent.studentArray[i][1]==name)
                    {
                       cout<<myStudent.studentArray[i][0] + " " + myStudent.studentArray[i][1] + " " + myStudent.studentArray[i][2]<<endl;
                    }
                }
                break;
            }
            case 3:
            {
                cout<<"Enter the student surname:";
                cin>>surname;
                for(int i=0;i<temp;i++)
                {
                    if(myStudent.studentArray[i][2]==surname)
                    {
                       cout<<myStudent.studentArray[i][0] + " " + myStudent.studentArray[i][1] + " " + myStudent.studentArray[i][2]<<endl;
                    }
                }
                break;
            }
            case 4:
            {
                cout<<"Enter the student ID:";
                cin>>id;
                for(int i=0;i<temp;i++){
                    for(int j=i+1;j<temp;j++){
                        quick_sort(myStudent.studentArray[temp][0],temp);
                    }
                }
                int binary=temp/2;
                for(int i=0;i<temp;i++)
                {
                    if(myStudent.studentArray[binary][0]>id)
                    {
                        binary = binary - binary/2;
                    }
                    if(myStudent.studentArray[binary][0]<id)
                    {
                        binary = binary + binary/2;
                    }
                    if(myStudent.studentArray[binary][0]==id)
                    {
                        cout<<myStudent.studentArray[binary][0]+ " " + myStudent.studentArray[binary][1]+ " " + myStudent.studentArray[binary][2]<<endl;
                        break;
                    }
                }
                break;
            }
            case 5:
            {
                cout<<"id/name/surname"<<endl;
                for(int i=0;i<temp;i++)
                {
                    cout<<myStudent.studentArray[i][0]+ " " + myStudent.studentArray[i][1] + " " + myStudent.studentArray[i][2]<<endl;
                }
                break;
            }    

        }
        cout<<"Want to select action again?(y/Y)";
        cin>>ans1;
    }while(ans1=='y'||ans1=='Y');
    return 0;
}

string Student::getName()
{
    return name;
}

string Student::getSurname()
{
    return surname;
}

string Student::getID()
{
    return ID;
}

void Student::setName(string stdName)
{
    name=stdName;
}

void Student::setSurname(string stdSurname)
{
    surname=stdSurname;
}

void Student::setID(string stdID)
{
    ID=stdID;
}
#包括
#包括
使用名称空间std;
班级学生
{
公众:
字符串studentArray[100][3];
字符串getName();
字符串getname();
字符串getID();
void setName(字符串stdName);
void setSurname(字符串stdSurname);
void setID(字符串stdIDs);
私人:
字符串名;
串姓;
字符串ID;
};
int快速排序帮助(字符串和文本、int左、int右)
{
char val=文本[右];
焦炭温度;
int j=右;
int i=左-1;
while(true)
{
while(text[++i]val){
如果(j==左)
打破
}
如果(i>=j)
打破
temp=文本[i];
文本[i]=文本[j];
文本[j]=温度;
}
temp=文本[i];
文本[i]=文本[右];
文本[右]=温度;
返回i;
}
无效快速排序(字符串和文本,左整数,右整数)
{
if(左<右)
{
int pivot=快速排序帮助(文本、左、右);
快速排序(文本,左,轴-1);
快速排序(文本,轴+1,右);
}
}
无效快速排序(字符串和文本,整数大小){
快速排序(文本,0,大小为1);
}
int main()
{
学生我的学生;
字符串名;
串姓;
字符串id;
智力选择;
内部温度=0;
char ans1;
做{

哥们,你的代码有严重的问题, 您的快速排序似乎正常,但您的程序却不正常

  • 如果要进行二进制搜索,最好明智地插入以保持列表排序
  • 调用快速排序函数不需要循环
  • 调用quicksort后,您将得到一个部分排序的列表,其中quicksort实际上不太好,因此最好使用插入排序
  • 我稍微修改了你的代码,你仍然可以做得更多

        #include <iostream>
        #include <string>
    
        using namespace std;
    
        class Student
        {
        public:
            string getName();
            string getSurname();
            string getID();
            void setName(string stdName);
            void setSurname(string stdSurname);
            void setID(string stdIDs);
        private:
            string name;
            string surname;
            string ID;
        };
    
        int quick_sort_help(Student students[],int left, int right)
        {
            Student val = students[right];
            Student temp;
    
            int j = right;
            int i = left - 1;
    
            while (true)
            {
                while (students[++i].getID() < val.getID());
    
                while (students[--j].getID() > val.getID()) {
                    if(j == left)
                        break;
                }
    
                if(i >= j)
                    break;
    
                temp=students[i];
                students[i]=students[j];
                students[j]=temp;
            }
    
            temp=students[i];
            students[i]=students[right];
            students[right]=temp;
    
            return i;
        }
    
        void quicksort(Student students[],int left, int right)
        {
            if (left < right)
            {
                int pivot = quick_sort_help(students, left, right);
                quicksort(students, left, pivot - 1);
                quicksort(students, pivot + 1, right);
            }
        }
    
        void quick_sort(Student students[],int size){
            quicksort(students,0,size-1);
        }
    
        int main()
        {
            Student myStudent[100];
            string name;
            string surname;
            string id;
            int choice;
            int temp=0;
            char ans1;
            do
            {
                cout<<"Please enter Student's name: ";
                cin>>name;
                cout<<"Please enter Student's surname: ";
                cin>>surname;
                cout<<"Please enter Student's ID: ";
                cin>>id;
                myStudent[temp].setName(name);
                myStudent[temp].setSurname(surname);
                myStudent[temp].setID(id);
                cout<<"Want to add new Student? (y/n)";
                cin>>ans1;
                temp++;
            }while(ans1=='y'||ans1=='Y');
    
            quick_sort(myStudent, temp);
            do{
                cout<<"What do you want to search with?"<<endl;
                cout<<"1-)Search with name:"<<endl;
                cout<<"2-)Search with surname:"<<endl;
                cout<<"3-)Search with ID (binary!):"<<endl;
                cout<<"4-)Show List!"<<endl;
                cin>>choice;
    
                switch (choice)
                {
                case 1:
                    {
                        cout<<"Enter the student name:";
                        cin>>name;
                        for(int i=0;i<temp;i++)
                        {
                            if(myStudent[i].getName()==name)
                            {
                                cout<<myStudent[i].getID() + " " + myStudent[i].getName() + " " + myStudent[i].getSurname()<<endl;
                            }
                        }
                        break;
                    }
                case 2:
                    {
                        cout<<"Enter the student surname:";
                        cin>>surname;
                        for(int i=0;i<temp;i++)
                        {
                            if(myStudent[i].getSurname()==surname)
                            {
                                cout<<myStudent[i].getID() + " " + myStudent[i].getName() + " " + myStudent[i].getSurname()<<endl;
                            }
                        }
                        break;
                    }
                case 3:
                    {
                        cout<<"Enter the student ID:";
                        cin>>id;
                        int left=0;
                        int right = temp;
                        int mid = (right + left)/2;
                        while(left <= right){
                            if(myStudent[mid].getID()>id)
                            {
                                right = mid - 1;
                                mid = (right+left)/2;
                            }
                            if(myStudent[mid].getID()<id)
                            {
                                left = mid + 1;
                                mid = (right+left)/2;
                            }
                            if(myStudent[mid].getID()==id)
                            {
                                cout<<myStudent[mid].getID()+ " " + myStudent[mid].getName()+ " " + myStudent[mid].getSurname()<<endl;
                                break;
                            }
                        }
                        break;
                    }
                case 4:
                    {
                        cout<<"id/name/surname"<<endl;
                        for(int i=0;i<temp;i++)
                        {
                            cout<<myStudent[i].getID()+ " " + myStudent[i].getName() + " " + myStudent[i].getSurname()<<endl;
                        }
                        break;
                    }    
                }
                cout<<"Do you want to continue?(y/n)"<<endl;
                cin>>ans1;
            }while(ans1=='y' || ans1=='Y');
    
            return 0;
        }
    
        string Student::getName()
        {
            return name;
        }
    
        string Student::getSurname()
        {
            return surname;
        }
    
        string Student::getID()
        {
            return ID;
        }
    
        void Student::setName(string stdName)
        {
            name=stdName;
        }
    
        void Student::setSurname(string stdSurname)
        {
            surname=stdSurname;
        }
    
        void Student::setID(string stdID)
        {
            ID=stdID;
        }
    
    #包括
    #包括
    使用名称空间std;
    班级学生
    {
    公众:
    字符串getName();
    字符串getname();
    字符串getID();
    void setName(字符串stdName);
    void setSurname(字符串stdSurname);
    void setID(字符串stdIDs);
    私人:
    字符串名;
    串姓;
    字符串ID;
    };
    int快速排序帮助(学生[],int左,int右)
    {
    学生val=学生[右];
    学生临时工;
    int j=右;
    int i=左-1;
    while(true)
    {
    而(学生[++i].getID()val.getID()){
    如果(j==左)
    打破
    }
    如果(i>=j)
    打破
    临时工=学生[i];
    学生[i]=学生[j];
    学生[j]=临时工;
    }
    临时工=学生[i];
    学生[我]=学生[对];
    学生[右]=临时工;
    返回i;
    }
    无效快速排序(学生[],左整数,右整数)
    {
    if(左<右)
    {
    int pivot=快速排序帮助(学生,左,右);
    快速排序(学生,左,轴-1);
    快速排序(学生,轴+1,右);
    }
    }
    无效快速排序(学生[],整数大小){
    快速排序(学生,0,大小为1);
    }
    int main()
    {
    学生我的学生[100];
    字符串名;
    串姓;
    字符串id;
    智力选择;
    内部温度=0;
    char ans1;
    做
    {
    coutname;
    coutsurname;
    库蒂德;
    myStudent[temp].setName(name);
    myStudent[temp].setSurname(姓氏);
    myStudent[temp].setID(id);
    库坦1;
    temp++;
    }而(ans1='y'| | ans1=='y');
    快速排序(myStudent,temp);
    做{
    
    你真的需要消除不相关的代码,并尽可能少地展示仍能说明问题的代码(尽管我应该通过包含代码来补充这一点,你比大多数第一次发布的海报做得更好)。它是缩进的,但在复制粘贴后很难读取。对不起,为什么快速排序的第一个参数是对单个字符串的引用?案例4开头的两个嵌套的
    for
    循环的目的是什么?查看您的代码,我想您应该做的第一件事是复习您的学生课程。是吗他学生阵列真的属于那里吗?@高炉是的,我意识到两个嵌套的循环在那里没有任何作用。1&&3)这是一个快速排序作业,所以我只能使用快速排序算法2)我删除了循环,但我忘了编辑这里我的作业是创建一个学生类,添加一些具有随机ID的学生,然后对他们进行快速排序和搜索id中的一名学生。1)删除主声明中的“student myStudent[100]”中的“string studentArray[100][3];“非常感谢,伙计,我成功地做到了,有一个小错误,但并不重要。
    case 4:
    {
        cout<<"Enter the student ID:";
        cin>>id;
        for(int i=0;i<temp;i++){
            for(int j=i+1;j<temp;j++){
                quick_sort(myStudent.studentArray[temp][0],temp);
            }
        }
        int binary=temp/2;
        for(int i=0;i<temp;i++)
        {
            if(myStudent.studentArray[binary][0]>id)
            {
                binary = binary - binary/2;
            }
            if(myStudent.studentArray[binary][0]<id)
            {
                binary = binary + binary/2;
            }
            if(myStudent.studentArray[binary][0]==id)
            {
                cout<<myStudent.studentArray[binary][0]+ " " + myStudent.studentArray[binary][1]+ " " + myStudent.studentArray[binary][2]<<endl;
                break;
            }
        }
        break;
    }
    
      void quickSort(Student arr[], int left, int right)
      {
         int i = left, j = right;
         Student tmp;
         int pivot = arr[(left + right) / 2].getID();
    
      /* partition */
         while (i <= j) {
           while (arr[i].getID() < pivot)
                  i++;
            while (arr[j].getID() > pivot)
                  j--;
            if (i <= j) {
                  tmp = arr[i];
                  arr[i] = arr[j];
                  arr[j] = tmp;
                  i++;
                  j--;
        }
    }
    /* recursion */
    if (left < j)
        quickSort(arr, left, j);
    if (i < right)
            quickSort(arr, i, right);
    } 
    
                  int binary=temp/2;
            for(int i=0;i<temp;i++)
            {
              if(myStudent[binary].getID()>srcid)
              {
                binary = binary - binary/2;
              }
              if(myStudent[binary].getID()<srcid)
              {
                binary = binary + binary/2;
              }
              if(myStudent[binary].getID()==srcid)
              {
               cout<<myStudent[binary].getID()+ " " + myStudent[binary].getName()+ " " + myStudent[binary].getSurname()<<endl;
    
             break;
             }
    
        #include <iostream>
        #include <string>
    
        using namespace std;
    
        class Student
        {
        public:
            string getName();
            string getSurname();
            string getID();
            void setName(string stdName);
            void setSurname(string stdSurname);
            void setID(string stdIDs);
        private:
            string name;
            string surname;
            string ID;
        };
    
        int quick_sort_help(Student students[],int left, int right)
        {
            Student val = students[right];
            Student temp;
    
            int j = right;
            int i = left - 1;
    
            while (true)
            {
                while (students[++i].getID() < val.getID());
    
                while (students[--j].getID() > val.getID()) {
                    if(j == left)
                        break;
                }
    
                if(i >= j)
                    break;
    
                temp=students[i];
                students[i]=students[j];
                students[j]=temp;
            }
    
            temp=students[i];
            students[i]=students[right];
            students[right]=temp;
    
            return i;
        }
    
        void quicksort(Student students[],int left, int right)
        {
            if (left < right)
            {
                int pivot = quick_sort_help(students, left, right);
                quicksort(students, left, pivot - 1);
                quicksort(students, pivot + 1, right);
            }
        }
    
        void quick_sort(Student students[],int size){
            quicksort(students,0,size-1);
        }
    
        int main()
        {
            Student myStudent[100];
            string name;
            string surname;
            string id;
            int choice;
            int temp=0;
            char ans1;
            do
            {
                cout<<"Please enter Student's name: ";
                cin>>name;
                cout<<"Please enter Student's surname: ";
                cin>>surname;
                cout<<"Please enter Student's ID: ";
                cin>>id;
                myStudent[temp].setName(name);
                myStudent[temp].setSurname(surname);
                myStudent[temp].setID(id);
                cout<<"Want to add new Student? (y/n)";
                cin>>ans1;
                temp++;
            }while(ans1=='y'||ans1=='Y');
    
            quick_sort(myStudent, temp);
            do{
                cout<<"What do you want to search with?"<<endl;
                cout<<"1-)Search with name:"<<endl;
                cout<<"2-)Search with surname:"<<endl;
                cout<<"3-)Search with ID (binary!):"<<endl;
                cout<<"4-)Show List!"<<endl;
                cin>>choice;
    
                switch (choice)
                {
                case 1:
                    {
                        cout<<"Enter the student name:";
                        cin>>name;
                        for(int i=0;i<temp;i++)
                        {
                            if(myStudent[i].getName()==name)
                            {
                                cout<<myStudent[i].getID() + " " + myStudent[i].getName() + " " + myStudent[i].getSurname()<<endl;
                            }
                        }
                        break;
                    }
                case 2:
                    {
                        cout<<"Enter the student surname:";
                        cin>>surname;
                        for(int i=0;i<temp;i++)
                        {
                            if(myStudent[i].getSurname()==surname)
                            {
                                cout<<myStudent[i].getID() + " " + myStudent[i].getName() + " " + myStudent[i].getSurname()<<endl;
                            }
                        }
                        break;
                    }
                case 3:
                    {
                        cout<<"Enter the student ID:";
                        cin>>id;
                        int left=0;
                        int right = temp;
                        int mid = (right + left)/2;
                        while(left <= right){
                            if(myStudent[mid].getID()>id)
                            {
                                right = mid - 1;
                                mid = (right+left)/2;
                            }
                            if(myStudent[mid].getID()<id)
                            {
                                left = mid + 1;
                                mid = (right+left)/2;
                            }
                            if(myStudent[mid].getID()==id)
                            {
                                cout<<myStudent[mid].getID()+ " " + myStudent[mid].getName()+ " " + myStudent[mid].getSurname()<<endl;
                                break;
                            }
                        }
                        break;
                    }
                case 4:
                    {
                        cout<<"id/name/surname"<<endl;
                        for(int i=0;i<temp;i++)
                        {
                            cout<<myStudent[i].getID()+ " " + myStudent[i].getName() + " " + myStudent[i].getSurname()<<endl;
                        }
                        break;
                    }    
                }
                cout<<"Do you want to continue?(y/n)"<<endl;
                cin>>ans1;
            }while(ans1=='y' || ans1=='Y');
    
            return 0;
        }
    
        string Student::getName()
        {
            return name;
        }
    
        string Student::getSurname()
        {
            return surname;
        }
    
        string Student::getID()
        {
            return ID;
        }
    
        void Student::setName(string stdName)
        {
            name=stdName;
        }
    
        void Student::setSurname(string stdSurname)
        {
            surname=stdSurname;
        }
    
        void Student::setID(string stdID)
        {
            ID=stdID;
        }