template< typename Iterator > void cocktail_sort( Iterator first, Iterator last ) { for( --last; first < last; --last, ++first ) { for( Iterator i = first; i < last; ++i ) if ( *(i + 1) < *i ) std::iter_swap( i, i + 1 ); for( Iterator i = last - 1; i > first; --i ) if ( *i < *(i - 1) ) std::iter_swap( i, i - 1 ); } } #include { if (L >= R) return; int m = (L + R) /2;//int m = (L + R) >>1; \\ сдвиг работает быстрее. int mediana = arr[m]; int LL = L; int RR = R; while (LL < RR) { while (arr[LL] < mediana) LL++; while (arr[RR] > mediana) RR--; if (LL <= RR) { int swap = arr[LL]; arr[LL] = arr[RR]; arr[RR] = swap; LL++; RR--; } } if (LL sort (arr , LL , R); if (RR > L) sort (arr , L , RR); } void main(void) { int arr[] = { 1, 3, 2, 7, 5, 8, 0, 4, 6, 9 }; int ARR_LENGTH = sizeof (arr) / sizeof (int); sort (arr , 0 , ARR_LENGTH - 1); for (int i=0; i < ARR_LENGTH; i++) printf ("%4d" , arr [i] ); }void sort(int arr[], int L, int R)