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