2015-11-28 84 views
2

我的代碼有問題。我傳入一串字符串(名稱),我想快速排序並按字母順序排序。然後,我想要做的是用我的年齡和年齡排列,將這些值分別與在我的名字數組中交換的值交換。但是,我在嘗試執行該操作時遇到了問題。Quicksort字符串向量按字母順序排列

在主函數中,我通過在:

quicksort(names, names[0], names[names.size() - 1]); 

並在代碼中包含

void quicksort(vector<string> &names, string min, string max){ 
cout << "\n\tSorting names...\n"; 

int    temp = 0, 
       i = 0; 

string   lowMin = max, 
       lowMax = min, 
       highMin = max, 
       highMax = min, 
       pivot; 

vector<string> below, 
       above; 

if (min != max){ 

    pivot = (max[i] + min[i])/2; 

    while (temp < names.size()){ 
     if (names[temp] <= pivot){ 
      if (lowMax.compare(names[temp]) < 0){ 
       lowMax = names[temp]; 
      } 

      if (lowMin.compare(names[temp]) > 0){ 
       lowMin = names[temp]; 
      } 

      below.push_back(names[temp]); 

     } 
     else { 
      if (highMax.compare(names[temp]) < 0){ 
       highMax = names[temp]; 
      } 

      if (highMin.compare(names[temp]) > 0){ 
       highMin = names[temp]; 
      } 

      above.push_back(names[temp]); 
     } 
     temp++; 
    } 

    if ((below.size() > 1) && (names.size() != below.size())){ 
     quicksort(below, lowMin, lowMax); 
    } 
    if ((above.size() > 1) && (names.size() != above.size())){ 
     quicksort(above, highMin, highMax); 
    } 
    for (size_t i = 0; i < below.size(); i++){ 
     names[i] = below[i]; 
    } 
    for (size_t i = below.size(); i < names.size(); i++){ 
     names[i] = above[i - below.size()]; 
    } 

    } 

} // // End quicksort() 

在這種情況下,這將是更好地使交換功能和兩個整數發送所以我可以在我的其他矢量數組中交換值?例如,我在想swapValue(int i, int j){ /* do something */} 另外,有人可以向我解釋foobar[i].swap(foobar[j])swap(foobar[i], foobar[j])之間的區別嗎?這些方法比創建臨時變量和交換值更高效嗎?

+4

如果你想把所有三個相關的值放在一個結構體/類中,並創建一個對象的向量,一個簡單的std :: sort調用就足夠了,而不是寫出整個算法...... – deviantfan

+1

即使你想實現quicksort,你可以使用其他STL算法函數來實現 - http://stackoverflow.com/questions/24650626/how-to-implement-classic-sorting-algorithms-in-modern-c – PaulMcKenzie

回答

4

如果你這樣做,不要執行quicksort,因爲你需要使用一些排序算法。

對於名稱,年齡和年份,您似乎有三個std::vector,其中位於相同位置的元素是相關的。爲什麼不把所有東西結合起

struct Person //or some name 
{ 
    std::string name; 
    int age; 
    int year; 

    int operator<(const Person &other) //comparison 
    { 
     return name.compare(other.name); 
    } 
}; 

當然,如果你願意的話,你也可以用Big5等做一個完整的課程。

現在,隨着vector<Person> v;,你可以使用std::sort

std::sort(v.begin(), v.end()); 

這就是全部。

...如果你仍然想要有一個快速排序功能, this,並用交換來改變行,以便在所有三個向量上進行交換。

關於你的另一個問題:

std::string交換和用繩子paramters獨立的功能互換做同樣的事情(從技術上講,他們沒有,他們是完全獨立的,但他們這樣做)。

爲什麼swap(a,b)優於c=a;a=b;b=c;
在第二個代碼,值複製三次。對於std::string,這意味着分配三次新內存並複製整個內容。 Swap可以在沒有任何內容拷貝的情況下完成它(它可以訪問內部指針等並僅交換這些內​​容)。