簡體   English   中英

Quicksort字符串向量按字母順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM