【问题标题】:How to sort a vector<string> using selection sort如何使用选择排序对向量<string> 进行排序
【发布时间】:2015-12-24 17:09:17
【问题描述】:

如果存在字符串向量std::vector&lt;string&gt; v,使用STL,我们可以这样排序:

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

我想使用选择排序来做到这一点,这是我的伪代码:

//for(i=0 to n-1){
//int min = i;
//for (j = i+1 to n){
//if (array[j]<array[min]){
//min = j;
//}
//if (min != i){
//swap array[min] and array[i];
//}
//}
//}

我使用迭代器的以下实现没有正确排序:

void sortDictionaryInsertionSort(){

        //for(i=0 to n-1)
        for (vector<string>::iterator oit = v.begin(); oit != v.end() - 1; oit++){
            //int min = i;
            vector<string>::iterator min = oit;
            //for j = i+1 to n
            for (vector<string>::iterator iit = v.begin() + 1; iit != v.end(); iit++){
                //if array[j]<array[min]
                if (iit->compare(*min) < 0){
                    //min = j;
                    min = iit;
                }
            }
            //if (min != i){
            if (min != oit){
                //swap array[min] and array[i]
                std::iter_swap(min, oit);
            }
        }

    }

所以如果向量包含:

fezzy
dizzy
abuzz

排序后应该是这样的:

abuzz
dizzy
fezzy

【问题讨论】:

标签: c++ sorting vector selection-sort


【解决方案1】:

您应该初始化 itt 以仅迭代 oit 之后的未排序范围,而不是从头开始的整个向量(这将再次混合已经排序的元素):

vector<string>::iterator iit = oit + 1;

你应该在函数的开头检查if(v.empty()) return;。在空容器上执行
v.end() - 1 是未定义的行为。

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 2021-12-07
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    相关资源
    最近更新 更多