Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <utility>
- struct CPoint {
- int X = 0;
- int Y = 0;
- CPoint() = default;
- CPoint( int x, int y ) : X( x ), Y( y ) {}
- bool operator<( const CPoint& other ) const { return X < other.X; }
- };
- // Вариант 1. Использование оператора < в сортировке.
- void BubbleSort( CPoint* begin, CPoint* end )
- {
- const int size = end - begin;
- for( int i = 0; i < size - 1; ++i ) {
- for( int j = 0; j < size - 1 - i; ++j ) {
- if( begin[j + 1] < begin[j] ) {
- std::swap( begin[j + 1], begin[j] );
- }
- }
- }
- }
- // Вариант 2. Использование функции сравнения.
- void BubbleSort( CPoint* begin, CPoint* end, bool ( *compareFunction )( const CPoint&, const CPoint& ) )
- {
- const int size = end - begin;
- for( int i = 0; i < size - 1; ++i ) {
- for( int j = 0; j < size - 1 - i; ++j ) {
- if( compareFunction( begin[j + 1], begin[j] ) ) {
- std::swap( begin[j + 1], begin[j] );
- }
- }
- }
- }
- // Вариант 3. Использование функтора.
- // Функтор, сравнивающий точки по расстоянию от некоторой заданной.
- class CMyFunctor {
- public:
- explicit CMyFunctor( const CPoint& _center ) : center( _center ) {}
- bool operator()( const CPoint& left, const CPoint& right ) const
- {
- return ( left.X - center.X ) * ( left.X - center.X ) + ( left.Y - center.Y ) * ( left.Y - center.Y ) <
- ( right.X - center.X ) * ( right.X - center.X ) + ( right.Y - center.Y ) * ( right.Y - center.Y );
- }
- private:
- CPoint center;
- };
- void BubbleSort( CPoint* begin, CPoint* end, const CMyFunctor& functor )
- {
- const int size = end - begin;
- for( int i = 0; i < size - 1; ++i ) {
- for( int j = 0; j < size - 1 - i; ++j ) {
- if( functor( begin[j + 1], begin[j] ) ) {
- std::swap( begin[j + 1], begin[j] );
- }
- }
- }
- }
- // Вариант 4. Шаблонный. Может принимать и функцию, и функтор любого типа с оператором (,).
- template <class T>
- void BubbleSortUniversal( CPoint* begin, CPoint* end, const T& functor )
- {
- const int size = end - begin;
- for( int i = 0; i < size - 1; ++i ) {
- for( int j = 0; j < size - 1 - i; ++j ) {
- if( functor( begin[j + 1], begin[j] ) ) {
- std::swap( begin[j + 1], begin[j] );
- }
- }
- }
- }
- // Сравнение точек по Евклидовому расстоянию от (0, 0).
- bool ComparePointsByDistanceFromZero( const CPoint& left, const CPoint& right )
- {
- return left.X * left.X + left.Y * left.Y < right.X * right.X + right.Y * right.Y;
- }
- int main()
- {
- int size = 0;
- std::cin >> size;
- CPoint* points = new CPoint[size];
- for( int i = 0; i < size; ++i ) {
- std::cin >> points[i].X >> points[i].Y;
- }
- CMyFunctor functor( CPoint( 2, 2 ) );
- BubbleSortUniversal( points, points + size, functor );
- for( int i = 0; i < size; ++i ) {
- std::cout << points[i].X << ' ' << points[i].Y << std::endl;
- }
- delete[] points;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement