选择排序 - 循环过早停止
Selection sort - loop stops too early
我正在尝试编写选择排序。一切正常,但我的算法没有遍历整个向量_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;
}
相关文章:
- 气泡排序未正确循环
- C++ - 如何保持半随机数组在循环中排序
- 按升序对数组进行排序嵌套循环问题
- 如何并行化矩阵排序以进行循环
- 气泡排序循环,将一个数字更改为 0
- 选择排序 - 循环过早停止
- 尝试对字符串数组进行排序,但我似乎陷入了循环
- 循环中对向量进行排序
- 在 for 循环中重新排序测试条件:编译器错误?
- 单排序链表-无限循环
- 如何在不使用循环的情况下进行排序
- 提高循环缓冲区或堆排序性能
- 创建一个C++预排序迭代器,为循环提供树节点
- 使用 while 循环和 for 循环进行排序
- 计数排序无限循环
- 计数排序卡在 for 循环中
- 有什么更有效的方法来确保我不会在这个快速排序函数中陷入无限循环?(C++)
- 将"for"循环更改为单个"for"循环(排序)
- Qt foreach循环排序与QList的for循环排序
- 使用if循环排序时出现意外结果-糟糕的算法