[英]Quicksort String Vector Alphabetically
我在編寫代碼時遇到了麻煩。 我傳入了一個字符串(名稱)數組,我想進行快速排序並按字母順序對其進行排序。 然后,我想對我的年和年齡數組進行操作,分別將這些值與在我的名稱數組中交換的值交換。 但是,我在嘗試實現它時遇到了麻煩。
在主要功能中,我傳入:
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])
? 這些方法是否比創建臨時變量和交換值更有效?
如果僅因為需要使用某種排序算法,就不要實施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
的交換和帶有字符串參數的獨立函數的交換執行相同的操作(從技術上講,它們不是必須的,它們是完全獨立的,但是它們是這樣做的)。
以及為什么swap(a,b)
優於c=a;a=b;b=c;
:
在第二個代碼中,值被復制了三次。 對於std::string
,這意味着三次分配新內存並復制整個內容。 交換可以做到這一點而無需任何內容復制(它可以訪問內部指針等,並且僅交換這些內容)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.