#include <iostream>
using namespace std;
typedef pair< double * ,int > ( * TFunc) ( double * a, int n) ;
pair< double * ,int > bubblesort( double * a, int n) ;
pair< double * ,int > vibor( double * a, int n) ;
void sort( double * a, int n, TFunc f) ;
ostream& operator<< ( ostream& os, const pair< double * ,int > & p)
{
for ( int i = 0 ; i < p.second ; ++ i)
os << p.first [ i] << "\t " ;
return os << endl;
}
TFunc menu( ) ;
int main( )
{
TFunc item;
int n;
cout << "Enter the amount of elements in array --> " << endl;
cin >> n;
double * a = new double [ n] ;
cout << "Array before selecting a way to sort:\n " ;
for ( int i = 0 ; i < n; i++ )
{
cout << i + 1 << "-ый элемент: " ;
cin >> a[ i] ;
}
for ( int i = 0 ; i < n; i++ )
{
cout << a[ i] << " " ;
}
cout << endl;
item = menu( ) ;
if ( item == NULL )
{
cout << "Function number is entered incorrectly!" ;
}
else
{
sort( a, n, item) ;
}
delete [ ] a;
}
pair< double * ,int > bubblesort( double * a, int n)
{
for ( int i = 0 ; i < n; i++ )
{
for ( int j = 0 ; j < n - 1 ; j++ )
{
if ( a[ j] < a[ j + 1 ] )
{
double temp = a[ j] ;
a[ j] = a[ j + 1 ] ;
a[ j + 1 ] = temp;
}
}
}
return make_pair( a,n) ;
}
pair< double * ,int > vibor( double * a, int n)
{
for ( int i = 0 ; i < n - 1 ; i++ )
{
int biggestIndex = i;
for ( int j = i + 1 ; j < n; j++ )
{
if ( a[ j] > a[ biggestIndex] )
{
biggestIndex = j;
}
}
swap( a[ i] , a[ biggestIndex] ) ;
}
return make_pair( a,n) ;
}
void sort( double * a, int n, TFunc f)
{
cout << f( a, n) ;
}
TFunc menu( )
{
TFunc fun_items[ ] = { bubblesort, vibor } ;
int key;
cout << "Selecting a way to sort array:\n "
"1 - bubblesort, 2 - vibor\n " ;
cin >> key;
switch ( key)
{
case 1 :;
case 2 : return fun_items[ key - 1 ] ;
default : return NULL ;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgcGFpcjxkb3VibGUqLGludD4oKlRGdW5jKShkb3VibGUqIGEsIGludCBuKTsKCgpwYWlyPGRvdWJsZSosaW50PiBidWJibGVzb3J0KGRvdWJsZSogYSwgaW50IG4pOwpwYWlyPGRvdWJsZSosaW50PiB2aWJvcihkb3VibGUqIGEsIGludCBuKTsKdm9pZCBzb3J0KGRvdWJsZSogYSwgaW50IG4sIFRGdW5jIGYpOwoKb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgb3MsIGNvbnN0IHBhaXI8ZG91YmxlKixpbnQ+JiBwKQp7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgcC5zZWNvbmQ7ICsraSkKICAgICAgICBvcyA8PCBwLmZpcnN0W2ldIDw8ICJcdCI7CiAgICByZXR1cm4gb3MgPDwgZW5kbDsKfQoKVEZ1bmMgbWVudSgpOwoKaW50IG1haW4oKQp7CiAgICBURnVuYyBpdGVtOwogICAgaW50IG47CiAgICBjb3V0IDw8ICJFbnRlciB0aGUgYW1vdW50IG9mIGVsZW1lbnRzIGluIGFycmF5IC0tPiAiIDw8IGVuZGw7CiAgICBjaW4gPj4gbjsKICAgIGRvdWJsZSogYSA9IG5ldyBkb3VibGVbbl07CiAgICBjb3V0IDw8ICJBcnJheSBiZWZvcmUgc2VsZWN0aW5nIGEgd2F5IHRvIHNvcnQ6XG4iOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgY291dCA8PCBpICsgMSA8PCAiLdGL0Lkg0Y3Qu9C10LzQtdC90YI6ICI7CiAgICAgICAgY2luID4+IGFbaV07CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBjb3V0IDw8IGFbaV0gPDwgIiAiOwogICAgfQogICAgY291dCA8PCBlbmRsOwoKICAgIGl0ZW0gPSBtZW51KCk7CiAgICBpZiAoaXRlbSA9PSBOVUxMKQogICAgewogICAgICAgIGNvdXQgPDwgIkZ1bmN0aW9uIG51bWJlciBpcyBlbnRlcmVkIGluY29ycmVjdGx5ISI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgc29ydChhLCBuLCBpdGVtKTsKICAgIH0KICAgIGRlbGV0ZVtdIGE7Cn0KCnBhaXI8ZG91YmxlKixpbnQ+IGJ1YmJsZXNvcnQoZG91YmxlKiBhLCBpbnQgbikKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuIC0gMTsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGFbal0gPCBhW2ogKyAxXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZG91YmxlIHRlbXAgPSBhW2pdOwogICAgICAgICAgICAgICAgYVtqXSA9IGFbaiArIDFdOwogICAgICAgICAgICAgICAgYVtqICsgMV0gPSB0ZW1wOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG1ha2VfcGFpcihhLG4pOwp9CgpwYWlyPGRvdWJsZSosaW50PiB2aWJvcihkb3VibGUqIGEsIGludCBuKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyBpKyspCiAgICB7CiAgICAgICAgaW50IGJpZ2dlc3RJbmRleCA9IGk7CiAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbjsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGFbal0gPiBhW2JpZ2dlc3RJbmRleF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJpZ2dlc3RJbmRleCA9IGo7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3dhcChhW2ldLCBhW2JpZ2dlc3RJbmRleF0pOwogICAgfQogICAgcmV0dXJuIG1ha2VfcGFpcihhLG4pOwp9Cgp2b2lkIHNvcnQoZG91YmxlKiBhLCBpbnQgbiwgVEZ1bmMgZikKewogICAgY291dCA8PCBmKGEsIG4pOwp9CgpURnVuYyBtZW51KCkKewogICAgVEZ1bmMgZnVuX2l0ZW1zW10gPSB7IGJ1YmJsZXNvcnQsIHZpYm9yIH07CiAgICBpbnQga2V5OwogICAgY291dCA8PCAiU2VsZWN0aW5nIGEgd2F5IHRvIHNvcnQgYXJyYXk6XG4iCiAgICAgICAgIjEgLSBidWJibGVzb3J0LCAyIC0gdmlib3JcbiI7CiAgICBjaW4gPj4ga2V5OwogICAgc3dpdGNoIChrZXkpCiAgICB7CiAgICBjYXNlIDE6OwogICAgY2FzZSAyOiByZXR1cm4gZnVuX2l0ZW1zW2tleSAtIDFdOwogICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CiAgICB9Cn0K