#include <iostream>
#include <vector>
template<class RandomIt, class Consumer>
void my_for_each(RandomIt comeco, RandomIt fim, Consumer faz_algo) {
for (RandomIt it = comeco; it != fim; it++) {
faz_algo(*it);
}
}
template<class RandomIt, class Comparador>
void insertionsort(RandomIt comeco, RandomIt fim, Comparador cmp) {
for (RandomIt it = comeco + 1; it != fim ; it++) {
for (RandomIt it2 = it; it2 != comeco; it2--) {
RandomIt prev = it2 - 1;
if (cmp(*it2, *prev)) {
auto e = *it2;
*it2 = *prev;
*prev = e;
}
}
}
}
template<class RandomIt, class Comparador>
void bubblesort(RandomIt comeco, RandomIt fim, Comparador cmp) {
for (RandomIt it = fim - 1; it != comeco ; it--) {
for (RandomIt it2 = comeco; it2 != it; it2++) {
RandomIt next = it2 + 1;
if (!cmp(*it2, *next)) {
auto e = *it2;
*it2 = *next;
*next = e;
}
}
}
}
int main() {
std::vector<int> v = {3, 3, 2, 1};
insertionsort(v.begin(), v.end(), [](int a, int b) { return a < b; });
my_for_each(v.begin(), v.end(), [](int a) { std::cout << a << std::endl; });
std::vector<int> v2 = {3, 3, 2, 1};
bubblesort(v2.begin(), v2.end(), [](int a, int b) { return a < b; });
my_for_each(v2.begin(), v2.end(), [](int a) { std::cout << a << std::endl; });
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGU8Y2xhc3MgUmFuZG9tSXQsIGNsYXNzIENvbnN1bWVyPgp2b2lkIG15X2Zvcl9lYWNoKFJhbmRvbUl0IGNvbWVjbywgUmFuZG9tSXQgZmltLCBDb25zdW1lciBmYXpfYWxnbykgewoJZm9yIChSYW5kb21JdCBpdCA9IGNvbWVjbzsgaXQgIT0gZmltOyBpdCsrKSB7CgkJZmF6X2FsZ28oKml0KTsKCX0KfQoKdGVtcGxhdGU8Y2xhc3MgUmFuZG9tSXQsIGNsYXNzIENvbXBhcmFkb3I+CnZvaWQgaW5zZXJ0aW9uc29ydChSYW5kb21JdCBjb21lY28sIFJhbmRvbUl0IGZpbSwgQ29tcGFyYWRvciBjbXApIHsKCWZvciAoUmFuZG9tSXQgaXQgPSBjb21lY28gKyAxOyBpdCAhPSBmaW0gOyBpdCsrKSB7CgkJZm9yIChSYW5kb21JdCBpdDIgPSBpdDsgaXQyICE9IGNvbWVjbzsgaXQyLS0pIHsKCQkJUmFuZG9tSXQgcHJldiA9IGl0MiAtIDE7CgkJCWlmIChjbXAoKml0MiwgKnByZXYpKSB7CgkJCSAgYXV0byBlID0gKml0MjsKCQkJICAqaXQyID0gKnByZXY7CgkJCSAgKnByZXYgPSBlOwoJCQl9CgkJfQoJfQp9Cgp0ZW1wbGF0ZTxjbGFzcyBSYW5kb21JdCwgY2xhc3MgQ29tcGFyYWRvcj4Kdm9pZCBidWJibGVzb3J0KFJhbmRvbUl0IGNvbWVjbywgUmFuZG9tSXQgZmltLCBDb21wYXJhZG9yIGNtcCkgewoJZm9yIChSYW5kb21JdCBpdCA9IGZpbSAtIDE7IGl0ICE9IGNvbWVjbyA7IGl0LS0pIHsKCQlmb3IgKFJhbmRvbUl0IGl0MiA9IGNvbWVjbzsgaXQyICE9IGl0OyBpdDIrKykgewoJCQlSYW5kb21JdCBuZXh0ID0gaXQyICsgMTsKCQkJaWYgKCFjbXAoKml0MiwgKm5leHQpKSB7CgkJCSAgYXV0byBlID0gKml0MjsKCQkJICAqaXQyID0gKm5leHQ7CgkJCSAgKm5leHQgPSBlOwoJCQl9CgkJfQoJfQp9CgoKaW50IG1haW4oKSB7CglzdGQ6OnZlY3RvcjxpbnQ+IHYgPSB7MywgMywgMiwgMX07CglpbnNlcnRpb25zb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSwgW10oaW50IGEsIGludCBiKSB7IHJldHVybiBhIDwgYjsgfSk7CglteV9mb3JfZWFjaCh2LmJlZ2luKCksIHYuZW5kKCksIFtdKGludCBhKSB7IHN0ZDo6Y291dCA8PCBhIDw8IHN0ZDo6ZW5kbDsgfSk7CgoJc3RkOjp2ZWN0b3I8aW50PiB2MiA9IHszLCAzLCAyLCAxfTsKCWJ1YmJsZXNvcnQodjIuYmVnaW4oKSwgdjIuZW5kKCksIFtdKGludCBhLCBpbnQgYikgeyByZXR1cm4gYSA8IGI7IH0pOwoJbXlfZm9yX2VhY2godjIuYmVnaW4oKSwgdjIuZW5kKCksIFtdKGludCBhKSB7IHN0ZDo6Y291dCA8PCBhIDw8IHN0ZDo6ZW5kbDsgfSk7CglyZXR1cm4gMDsKfQ==