Sorting algorithms/Cocktail sort with shifting bounds: Difference between revisions

Content added Content deleted
m (promoted draft task to a (full) task.)
(Added C++ solution)
Line 236: Line 236:
</pre>
</pre>


=={{header|C++}}==
<lang cpp>#include <algorithm>
#include <cassert>
#include <iostream>
#include <iterator>
#include <vector>

// This only works for random access iterators
template <typename iterator>
void cocktail_shaker_sort(iterator begin, iterator end) {
if (begin == end)
return;
for (--end; begin < end; ) {
iterator new_begin = end;
iterator new_end = begin;
for (iterator i = begin; i < end; ++i) {
iterator j = i + 1;
if (*j < *i) {
std::iter_swap(i, j);
new_end = i;
}
}
end = new_end;
for (iterator i = end; i > begin; --i) {
iterator j = i - 1;
if (*i < *j) {
std::iter_swap(i, j);
new_begin = i;
}
}
begin = new_begin;
}
}

template <typename iterator>
void print(iterator begin, iterator end) {
if (begin == end)
return;
std::cout << *begin++;
while (begin != end) {
std::cout << ' ' << *begin++;
}
std::cout << '\n';
}

int main() {
std::vector<int> v{5, 1, -6, 12, 3, 13, 2, 4, 0, 15};
std::cout << "before: ";
print(v.begin(), v.end());
cocktail_shaker_sort(v.begin(), v.end());
assert(std::is_sorted(v.begin(), v.end()));
std::cout << "after: ";
print(v.begin(), v.end());
return 0;
}</lang>

{{out}}
<pre>
before: 5 1 -6 12 3 13 2 4 0 15
after: -6 0 1 2 3 4 5 12 13 15
</pre>


=={{header|Go}}==
=={{header|Go}}==