Last active
March 17, 2019 10:23
-
-
Save degski/e8e045f1e2ac23a55c081275f360ad43 to your computer and use it in GitHub Desktop.
constexpr comb_sort
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
template<typename Array> | |
constexpr void comb_sort_impl ( Array & array_ ) noexcept { | |
using size_type = typename Array::size_type; | |
size_type gap = array_.size ( ); | |
bool swapped = false; | |
while ( ( gap > size_type { 1 } ) or swapped ) { | |
if ( gap > size_type { 1 } ) { | |
gap = static_cast<size_type> ( gap / 1.247330950103979 ); | |
} | |
swapped = false; | |
for ( size_type i = size_type { 0 }; gap + i < static_cast< size_type > ( array_.size ( ) ); ++i ) { | |
if ( array_ [ i ] > array_ [ i + gap ] ) { | |
auto swap = array_ [ i ]; | |
array_ [ i ] = array_ [ i + gap ]; | |
array_ [ i + gap ] = swap; | |
swapped = true; | |
} | |
} | |
} | |
} | |
template<typename Array> | |
constexpr Array sort ( Array array_ ) { | |
auto sorted = array_; | |
comb_sort_impl ( sorted ); | |
return sorted; | |
} | |
int main ( ) { | |
constexpr auto sorted = sort ( std::array<int, 8> { 6, 8, 0, 1, 5, 9, 2, 7 } ); | |
for ( auto i : sorted ) | |
std::cout << i << ' '; | |
std::cout << std::endl; | |
return EXIT_SUCCESS; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment