#include <iterator>
#include <algorithm>
#include <iostream>
#include <vector>
#include <random>
template <typename container>
inline void
sort
(typename container::iterator beginning,
typename container::iterator end )
{
typedef typename container::value_type type_contained;
typename container::iterator beginning_original_state = beginning;
while (beginning <= end)
{
if (*beginning > *(beginning + 1))
{
// Gotta change the name to something more meaningful
auto check_back(beginning);
while (check_back != beginning_original_state && *check_back < *(check_back - 1))
{
std::swap(check_back, --check_back);
}
}
else
{
++beginning;
}
}
}
int main(){
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::mt19937 g(21356723);
std::shuffle(v.begin(), v.end(), g);
std::cout << "input: ";
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
//std::sort(v.begin(), v.end());
sort<std::vector<int>>(v.begin(), v.end());
std::cout << "output: ";
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
I2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxyYW5kb20+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgY29udGFpbmVyPgppbmxpbmUgdm9pZApzb3J0Cih0eXBlbmFtZSBjb250YWluZXI6Oml0ZXJhdG9yIGJlZ2lubmluZywKIHR5cGVuYW1lIGNvbnRhaW5lcjo6aXRlcmF0b3IgZW5kICAgICAgICkKewogICAgdHlwZWRlZiB0eXBlbmFtZSBjb250YWluZXI6OnZhbHVlX3R5cGUgdHlwZV9jb250YWluZWQ7CiAgICB0eXBlbmFtZSBjb250YWluZXI6Oml0ZXJhdG9yIGJlZ2lubmluZ19vcmlnaW5hbF9zdGF0ZSA9IGJlZ2lubmluZzsKICAgIHdoaWxlIChiZWdpbm5pbmcgPD0gZW5kKQogICAgewogICAgICAgIGlmICgqYmVnaW5uaW5nID4gKihiZWdpbm5pbmcgKyAxKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIEdvdHRhIGNoYW5nZSB0aGUgbmFtZSB0byBzb21ldGhpbmcgbW9yZSBtZWFuaW5nZnVsCiAgICAgICAgICAgIGF1dG8gY2hlY2tfYmFjayhiZWdpbm5pbmcpOwoKICAgICAgICAgICAgd2hpbGUgKGNoZWNrX2JhY2sgIT0gYmVnaW5uaW5nX29yaWdpbmFsX3N0YXRlICYmICpjaGVja19iYWNrIDwgKihjaGVja19iYWNrIC0gMSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChjaGVja19iYWNrLCAtLWNoZWNrX2JhY2spOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICsrYmVnaW5uaW5nOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKXsKICAgIHN0ZDo6dmVjdG9yPGludD4gdiA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CiAgICBzdGQ6Om10MTk5MzcgZygyMTM1NjcyMyk7CiAgICBzdGQ6OnNodWZmbGUodi5iZWdpbigpLCB2LmVuZCgpLCBnKTsKIAogICAgc3RkOjpjb3V0IDw8ICJpbnB1dDogIjsKICAgIHN0ZDo6Y29weSh2LmJlZ2luKCksIHYuZW5kKCksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxpbnQ+KHN0ZDo6Y291dCwgIiAiKSk7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgCiAgICAvL3N0ZDo6c29ydCh2LmJlZ2luKCksIHYuZW5kKCkpOwogICAgc29ydDxzdGQ6OnZlY3RvcjxpbnQ+Pih2LmJlZ2luKCksIHYuZW5kKCkpOwogICAgCiAgICBzdGQ6OmNvdXQgPDwgIm91dHB1dDogIjsKICAgIHN0ZDo6Y29weSh2LmJlZ2luKCksIHYuZW5kKCksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxpbnQ+KHN0ZDo6Y291dCwgIiAiKSk7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKfQ==