【发布时间】:2020-08-01 14:42:15
【问题描述】:
我正在尝试使用迭代器来实现插入排序算法,但它似乎并没有像我想象的那样工作......你对如何实现它有任何想法吗?
另外,我不能使用像这样的代码:https://www.geeksforgeeks.org/insertion-sort-using-c-stl/,因为我打算制作一个动画,它会变得更复杂。
这是我目前的源代码:
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> seq = { 5, 4, 3, 2, 1 };
std::vector<int>::iterator itj;
std::vector<int>::iterator leftmost;
// insertion sort
for (std::vector<int>::iterator iti = seq.begin() + 1; iti != seq.end(); iti = std::next(iti))
{
itj = std::prev(iti);
leftmost = iti;
while (std::distance(seq.begin(), itj) >= 0 && *itj > *leftmost)
{
std::next(itj) = itj;
itj = prev(itj);
}
std::next(itj) = leftmost;
}
// printing
for (std::vector<int>::iterator iti = seq.begin(); iti != seq.end(); iti = std::next(iti))
{
std::cout << *iti << " ";
}
}
【问题讨论】:
-
糟糕,我刚刚意识到您分享的链接有一个使用
rotate的实现。你能解释一下为什么这对你的情况不起作用。你想要一个以某种方式扩展插入排序的算法吗? -
是的,有点……所以目前,我正在尝试使用 sfml 为该算法制作可视化。
-
您需要具体说明您的算法应该做什么。话虽如此,如果可能,您应该将排序逻辑与其他逻辑分开(除非它是排序算法的一部分)。
-
@DanielCalota 如果你转到我在 cmets 中的 stackoverflow 链接,最重要的是摆脱这个测试:
*itj > *leftmost,而是调用一个返回true或 @ 的函数987654327@ 取决于左侧值是否放在右侧值之前。在该函数中,除了返回值之外,您还可以执行任何其他操作。此外,那个 geeksforgeeks 网站——不要从那里获取代码示例,因为它们中的大多数都很糟糕。