2016-11-21 1 views
0

クイックソートのアルゴリズム(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; 
} 

そしてメインのループ():下記

は私のクイックソートのための機能です、ソートされていない。どんな助けもありがとう!

+1

ベクトルを変更するには、参照渡しが必要です。それ以外の場合はローカルコピーを変更します – Slava

+0

'swapInt'と' swapString'などを書いたので、そのコードを複製するのではなく同じ方法で 'swapRecored' ? – Slava

+0

スラヴァありがとう、私はちょうどアンパサンドが必要でした。私はあなたの推薦に従ってその機能を書いていきます。それは理にかなっている! – jreed

答えて

0

が、私は私の機能を参照することにより、ベクトルを渡す必要がありました。私がベクトルのローカルコピーを編集する前に。

void quickSort(vector<record> &set, int start, int end) { 

int partition(vector<record> &set, int start, int end) { 

ありがとうスラヴァ!

0

あなたは単にベクトルをソートするstd::sort機能を使用することができます。スラヴァはコメントで指摘したように

bool comp(record rl, record rr) { 
    return (rl.id < rr.id); 
} 

vector<record> v; 
std::sort(v.begin(), v.end(), comp); 
+0

チップをありがとう、しかし、プログラムの目標は、自分のソート関数を記述し、構造体のベクトルのためにそれを実装することでした – jreed

関連する問題