选择排序 - 循环停止太早

时间:2017-10-19 11:05:38

标签: c++ sorting

我正在尝试编写选择排序。一切正常但我的算法并没有循环遍历整个向量_item而使我的v_sorted太短。元素排序正确。

sort.hpp

template<typename T>
std::vector<T> selection_sort(std::vector<T>);

sort.cpp

template<typename T>
std::vector<T> selection_sort(std::vector<T> _item) {
    std::vector<T> v_sorted;
    for(int i = 0; i < _item.size(); ++i) {
        T smallest = _item[0];
        for(auto const& j : _item) {
            if(j < smallest) {
                smallest = j;
            }
        }
        v_sorted.push_back(smallest);

        auto it = std::find(_item.begin(), _item.end(), smallest);
        if (it != _item.end()) {
            // to prevent moving all of items in vector
            // https://stackoverflow.com/a/15998752
            std::swap(*it, _item.back());
            _item.pop_back();
        }
    }
    return v_sorted;
}

template std::vector<int> selection_sort(std::vector<int> _item);

sort_tests.hpp

BOOST_AUTO_TEST_CASE(selection_sort_int)
{
    std::vector<int> v_unsorted = {3, 1, 2, 7, 6};
    std::vector<int> v_sorted = {1, 2, 3, 6, 7};
    auto v_test = exl::selection_sort(v_unsorted);
    BOOST_CHECK_EQUAL_COLLECTIONS(v_sorted.begin(), v_sorted.end(), 
                                  v_test.begin(), v_test.end());
}

此测试失败,Collections size mismatch: 5 != 3。任何测试都会因尺寸不匹配而失败。循环在三次迭代后停止(在这种情况下)。提前感谢任何线索。

2 个答案:

答案 0 :(得分:1)

当你只想增加一次时,for循环++i_item.pop_back()的同时效果会增加两倍。

将for循环更改为while循环:

while(!_item.empty()) 

Live Demo

答案 1 :(得分:1)

您正在重新实施std::min_element,如果您使用它,您不需要再次找到该元素,您也不想更改{{1}的大小同时循环它_item

您也可以按照以下方式进行排序:

size()