smatskevich

BubbleSort2018

Mar 14th, 2018
241
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×