选择排序 - 循环过早停止

Selection sort - loop stops too early

本文关键字:循环 排序 选择      更新时间:2023-10-16

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

排序.hpp

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

排序.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 。任何测试都因大小不匹配而失败。循环在三次迭代后停止(在本例中)。提前感谢您提供任何线索。

for 循环的++i_item.pop_back()同时产生递增的效果,而你只想递增一次。

将 for 循环更改为 while 循环:

while(!_item.empty()) 

现场演示

您正在重新实现std::min_element,并且如果您使用它,则无需再次查找该元素,也不想在循环size()时更改_item的大小。

您也可以就地排序,如下所示:

template<typename T>
std::vector<T> selection_sort(std::vector<T> _item) {
    for(auto it = _item.begin(); it != _item.end(); ++it) {
        auto smallest = std::min_element(it, _item.end());
        std::iter_swap(it, smallest);
    }
    return _item;
}