Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using std::vector;
- struct CSegment {
- int Left = 0;
- int Right = 0;
- // Сравнение по левому краю, а если они совпадают, то по правому.
- bool operator<( const CSegment& other ) const
- { return Left < other.Left || ( Left == other.Left && Right < other.Right ); }
- };
- // Функция сравнения по длине.
- bool CompareByLength( const CSegment& first, const CSegment& second )
- {
- return first.Right - first.Left < second.Right - second.Left;
- }
- // Функтор для сортировки отрезков по убыванию длины.
- class CCompareByLengthDescending {
- public:
- bool operator()( const CSegment& first, const CSegment& second ) { return CompareByLength( second, first ); }
- };
- // Bubble sort, использующий оператор сравнения.
- void MyFirstSort( vector<CSegment>& arr )
- {
- const int n = arr.size();
- for( int i = 0; i < n - 1; ++i ) {
- for( int j = 1; j < n - i; ++j ) {
- if( arr[j] < arr[j - 1] ) {
- std::swap( arr[j], arr[j - 1] );
- }
- }
- }
- }
- // Bubble sort, получающий функцию сравнения.
- void MyFirstSort2( vector<CSegment>& arr, bool ( *compare )( const CSegment&, const CSegment& ) )
- {
- const int n = arr.size();
- for( int i = 0; i < n - 1; ++i ) {
- for( int j = 1; j < n - i; ++j ) {
- if( compare( arr[j], arr[j - 1] ) ) {
- std::swap( arr[j], arr[j - 1] );
- }
- }
- }
- }
- // Bubble sort, получающий либо функцию сравнения, либо функтор.
- template <typename Compare>
- void MyFirstSort3( vector<CSegment>& arr, Compare cmp )
- {
- const int n = arr.size();
- for( int i = 0; i < n - 1; ++i ) {
- for( int j = 1; j < n - i; ++j ) {
- if( cmp( arr[j], arr[j - 1] ) ) {
- std::swap( arr[j], arr[j - 1] );
- }
- }
- }
- }
- int main()
- {
- std::vector<CSegment> segments;
- CSegment segment;
- while( std::cin >> segment.Left >> segment.Right ) {
- segments.push_back( segment );
- }
- // MyFirstSort( segments );
- // MyFirstSort2( segments, CompareByLength );
- // MyFirstSort3( segments, CompareByLength );
- CCompareByLengthDescending comparator;
- MyFirstSort3( segments, comparator );
- // MyFirstSort3( segments, std::less<CSegment>() );
- for( int i = 0; i < segments.size(); ++i ) {
- std::cout << "[" << segments[i].Left << ", " << segments[i].Right << "]\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement