2016-11-21 68 views
0

我有結構的載體,以保持學生記錄:排序/交換結構的矢量的要素快速排序算法(C++)

struct record { 
    int id; 
    string name; 
    string address; 
    double gpa; 
    int *scorePtr; 
}; 

我被ID試圖排序的載體,但我可以」似乎弄明白了。我從.txt文件中將值讀入矢量,但是當我嘗試對它進行排序時,沒有任何元素被交換。

下面

是我對快速排序功能:

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

而且在主要環路()用於顯示向量:

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

當我運行它,我只是得到相同的名單兩次,未分類。任何幫助表示讚賞!

+1

要修改矢量,您必須通過引用來傳遞它,否則您正在修改本地副本 – Slava

+0

您寫了'swapInt'和'swapString'等,爲什麼不用同樣的方法寫'swapRecored',而不是重複那個代碼? – Slava

+0

謝謝Slava,我只需要&符。我會根據你的建議書寫這個功能。這就說得通了! – jreed

回答

0

作爲光榮的評論中指出,我需要參考我的函數傳遞載體。在我編輯矢量的本地副本之前。

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

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

謝謝Slava!

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