Advertisement
smatskevich

MyFirstSort

Oct 21st, 2017
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using std::vector;
  4.  
  5. struct CSegment {
  6.     int Left = 0;
  7.     int Right = 0;
  8.  
  9.     // Сравнение по левому краю, а если они совпадают, то по правому.
  10.     bool operator<( const CSegment& other ) const
  11.         { return Left < other.Left || ( Left == other.Left && Right < other.Right ); }
  12. };
  13.  
  14. // Функция сравнения по длине.
  15. bool CompareByLength( const CSegment& first, const CSegment& second )
  16. {
  17.     return first.Right - first.Left < second.Right - second.Left;
  18. }
  19.  
  20. // Функтор для сортировки отрезков по убыванию длины.
  21. class CCompareByLengthDescending {
  22. public:
  23.     bool operator()( const CSegment& first, const CSegment& second ) { return CompareByLength( second, first ); }
  24. };
  25.  
  26. // Bubble sort, использующий оператор сравнения.
  27. void MyFirstSort( vector<CSegment>& arr )
  28. {
  29.     const int n = arr.size();
  30.     for( int i = 0; i < n - 1; ++i ) {
  31.         for( int j = 1; j < n - i; ++j ) {
  32.             if( arr[j] < arr[j - 1] ) {
  33.                 std::swap( arr[j], arr[j - 1] );
  34.             }
  35.         }
  36.     }
  37. }
  38.  
  39. // Bubble sort, получающий функцию сравнения.
  40. void MyFirstSort2( vector<CSegment>& arr, bool ( *compare )( const CSegment&, const CSegment& ) )
  41. {
  42.     const int n = arr.size();
  43.     for( int i = 0; i < n - 1; ++i ) {
  44.         for( int j = 1; j < n - i; ++j ) {
  45.             if( compare( arr[j], arr[j - 1] ) ) {
  46.                 std::swap( arr[j], arr[j - 1] );
  47.             }
  48.         }
  49.     }
  50. }
  51.  
  52. // Bubble sort, получающий либо функцию сравнения, либо функтор.
  53. template <typename Compare>
  54. void MyFirstSort3( vector<CSegment>& arr, Compare cmp )
  55. {
  56.     const int n = arr.size();
  57.     for( int i = 0; i < n - 1; ++i ) {
  58.         for( int j = 1; j < n - i; ++j ) {
  59.             if( cmp( arr[j], arr[j - 1] ) ) {
  60.                 std::swap( arr[j], arr[j - 1] );
  61.             }
  62.         }
  63.     }
  64. }
  65.  
  66. int main()
  67. {
  68.     std::vector<CSegment> segments;
  69.     CSegment segment;
  70.     while( std::cin >> segment.Left >> segment.Right ) {
  71.         segments.push_back( segment );
  72.     }
  73.  
  74. //  MyFirstSort( segments );
  75. //  MyFirstSort2( segments, CompareByLength );
  76. //  MyFirstSort3( segments, CompareByLength );
  77.     CCompareByLengthDescending comparator;
  78.     MyFirstSort3( segments, comparator );
  79. //  MyFirstSort3( segments, std::less<CSegment>() );
  80.  
  81.     for( int i = 0; i < segments.size(); ++i ) {
  82.         std::cout << "[" << segments[i].Left << ", " << segments[i].Right << "]\n";
  83.     }
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement