Advertisement
smatskevich

BubbleSort2018

Mar 14th, 2018
416
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <utility>
  3.  
  4. struct CPoint {
  5.     int X = 0;
  6.     int Y = 0;
  7.  
  8.     CPoint() = default;
  9.     CPoint( int x, int y ) : X( x ), Y( y ) {}
  10.     bool operator<( const CPoint& other ) const { return X < other.X; }
  11. };
  12.  
  13. // Вариант 1. Использование оператора < в сортировке.
  14. void BubbleSort( CPoint* begin, CPoint* end )
  15. {
  16.     const int size = end - begin;
  17.     for( int i = 0; i < size - 1; ++i ) {
  18.         for( int j = 0; j < size - 1 - i; ++j ) {
  19.             if( begin[j + 1] < begin[j] ) {
  20.                 std::swap( begin[j + 1], begin[j] );
  21.             }
  22.         }
  23.     }
  24. }
  25.  
  26. // Вариант 2. Использование функции сравнения.
  27. void BubbleSort( CPoint* begin, CPoint* end, bool ( *compareFunction )( const CPoint&, const CPoint& ) )
  28. {
  29.     const int size = end - begin;
  30.     for( int i = 0; i < size - 1; ++i ) {
  31.         for( int j = 0; j < size - 1 - i; ++j ) {
  32.             if( compareFunction( begin[j + 1], begin[j] ) ) {
  33.                 std::swap( begin[j + 1], begin[j] );
  34.             }
  35.         }
  36.     }
  37. }
  38.  
  39. // Вариант 3. Использование функтора.
  40. // Функтор, сравнивающий точки по расстоянию от некоторой заданной.
  41. class CMyFunctor {
  42. public:
  43.     explicit CMyFunctor( const CPoint& _center ) : center( _center ) {}
  44.  
  45.     bool operator()( const CPoint& left, const CPoint& right ) const
  46.     {
  47.         return ( left.X - center.X ) * ( left.X - center.X ) + ( left.Y - center.Y ) * ( left.Y - center.Y ) <
  48.             ( right.X - center.X ) * ( right.X - center.X ) + ( right.Y - center.Y ) * ( right.Y - center.Y );
  49.     }
  50.  
  51. private:
  52.     CPoint center;
  53. };
  54.  
  55. void BubbleSort( CPoint* begin, CPoint* end, const CMyFunctor& functor )
  56. {
  57.     const int size = end - begin;
  58.     for( int i = 0; i < size - 1; ++i ) {
  59.         for( int j = 0; j < size - 1 - i; ++j ) {
  60.             if( functor( begin[j + 1], begin[j] ) ) {
  61.                 std::swap( begin[j + 1], begin[j] );
  62.             }
  63.         }
  64.     }
  65. }
  66.  
  67. // Вариант 4. Шаблонный. Может принимать и функцию, и функтор любого типа с оператором (,).
  68. template <class T>
  69. void BubbleSortUniversal( CPoint* begin, CPoint* end, const T& functor )
  70. {
  71.     const int size = end - begin;
  72.     for( int i = 0; i < size - 1; ++i ) {
  73.         for( int j = 0; j < size - 1 - i; ++j ) {
  74.             if( functor( begin[j + 1], begin[j] ) ) {
  75.                 std::swap( begin[j + 1], begin[j] );
  76.             }
  77.         }
  78.     }
  79. }
  80.  
  81. // Сравнение точек по Евклидовому расстоянию от (0, 0).
  82. bool ComparePointsByDistanceFromZero( const CPoint& left, const CPoint& right )
  83. {
  84.     return left.X * left.X + left.Y * left.Y < right.X * right.X + right.Y * right.Y;
  85. }
  86.  
  87. int main()
  88. {
  89.     int size = 0;
  90.     std::cin >> size;
  91.     CPoint* points = new CPoint[size];
  92.     for( int i = 0; i < size; ++i ) {
  93.         std::cin >> points[i].X >> points[i].Y;
  94.     }
  95.  
  96.     CMyFunctor functor( CPoint( 2, 2 ) );
  97.     BubbleSortUniversal( points, points + size, functor );
  98.  
  99.     for( int i = 0; i < size; ++i ) {
  100.         std::cout << points[i].X << ' ' << points[i].Y << std::endl;
  101.     }
  102.  
  103.     delete[] points;
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement