クイックソートのアルゴリズム(C++)のための構造体のベクトルの要素を交換/並べ替え:は、私が学生のレコードを保持する構造体のベクトルを持っている
struct record {
int id;
string name;
string address;
double gpa;
int *scorePtr;
};
「私はIDによってソートベクトルをしようとしているが、私はできますそれを理解しているようだ。私は.txtファイルからベクトルに値を読み込みますが、ソートしようとすると要素のどれも入れ替えられません。
//output vector
for(int k = 0; k < 20; k++) {
cout << sub[k].id << endl << sub[k].name << endl;
cout << sub[k].address << endl << fixed << setprecision(1) << sub[k].gpa << endl;
}
quickSort(sub, 0, 19);
cout << endl << endl;
//output vector
for(int k = 0; k < 20; k++) {
cout << sub[k].id << endl << sub[k].name << endl;
cout << sub[k].address << endl << fixed << setprecision(1) << sub[k].gpa << endl;
}
が、私はそれを実行すると、私はちょうど二度同じリストを取得:ベクトルを表示するための
void quickSort(vector<record> set, int start, int end) {
int pivotPoint;
if (start < end) {
//get the pivot point
pivotPoint = partition(set, start, end);
//sort first sublist
quickSort(set, start, pivotPoint - 1);
//sort second sublist
quickSort(set, pivotPoint + 1, end);
}
}
int partition(vector<record> set, int start, int end) {
int pivotValue, pivotIndex, mid;
mid = (start + end)/2;
swapInt(set[start].id, set[mid].id);
swapString(set[start].name, set[mid].name);
swapString(set[start].address, set[mid].address);
swapDouble(set[start].gpa, set[mid].gpa);
pivotIndex = start;
pivotValue = set[start].id;
for(int scan = start + 1; scan <= end; scan++) {
if (set[scan].id < pivotValue) {
pivotIndex++;
swapInt(set[pivotIndex].id, set[scan].id);
swapString(set[pivotIndex].name, set[scan].name);
swapString(set[pivotIndex].address, set[scan].address);
swapDouble(set[pivotIndex].gpa, set[scan].gpa);
}
}
swapInt(set[start].id, set[pivotIndex].id);
swapString(set[start].name, set[pivotIndex].name);
swapString(set[start].address, set[pivotIndex].address);
swapDouble(set[start].gpa, set[pivotIndex].gpa);
return pivotIndex;
}
void swapInt(int &value1, int &value2) {
int temp = value1;
value1 = value2;
value2 = temp;
}
void swapString(string &value1, string &value2) {
string temp = value1;
value1 = value2;
value2 = temp;
}
void swapDouble(double &value1, double &value2) {
double temp = value1;
value1 = value2;
value2 = temp;
}
そしてメインのループ():下記
は私のクイックソートのための機能です、ソートされていない。どんな助けもありがとう!
ベクトルを変更するには、参照渡しが必要です。それ以外の場合はローカルコピーを変更します – Slava
'swapInt'と' swapString'などを書いたので、そのコードを複製するのではなく同じ方法で 'swapRecored' ? – Slava
スラヴァありがとう、私はちょうどアンパサンドが必要でした。私はあなたの推薦に従ってその機能を書いていきます。それは理にかなっている! – jreed