Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- template <typename T> void sort(T* begin, T* const end, bool(*sortCrit)(const T&, const T&), void(*print)(const T*, const T*) = nullptr)
- {
- if (print) print(begin, end);
- T tmp;
- for (T* head{ begin }; head != end; ++head)
- {
- for (T* tail{ end - 1 }; tail != head; --tail)
- {
- if (sortCrit(*tail, *head))
- {
- tmp = *tail;
- *tail = *head;
- *head = tmp;
- if (print) print(begin, end);
- }
- }
- }
- if (print) print(begin, end);
- }
- template <typename T>
- void print(const T* begin, const T* const end)
- {
- while (begin != end)
- {
- std::cout << *begin++ << ' ';
- }
- std::cout << '\n';
- }
- template <typename T> bool ascending(const T& a, const T& b)
- {
- return a < b;
- }
- template <typename T> bool descending(const T& a, const T& b)
- {
- return a > b;
- }
- template <typename T> bool even(const T& a, const T& b)
- {
- return a % 2 == 0 and b % 2 !=0;
- }
- template <typename T> bool odd(const T& a, const T& b)
- {
- return a % 2 != 0 and b % 2 == 0;
- }
- template <typename T, bool(*sortTrue)(const T&, const T&), bool(*sortFalse)(const T&, const T&), bool(*criteria)(const T&, const T&)>
- bool parityOrdered(const T& a, const T& b)
- {
- return sortTrue(a,b) or (!sortFalse(a,b) and criteria(a, b));
- }
- int main()
- {
- const int arrASize{ 15 };
- const int arrBSize{ 15 };
- int arrA[arrASize]{ 6,1,4,2,8,9,4,26,2,7,8,11,7,2,3 };
- int arrB[arrBSize]{ 1,8,29,2,2,9,11,1,2,5,8,34,12,9,8 };
- std::cout << "Original arrays:\n";
- print(arrA, arrA + arrASize);
- print(arrB, arrB + arrBSize);
- std::cout << "Sorted arrays ascending/descending:\n";
- sort(arrA, arrA + arrASize, ascending<int>);
- sort(arrB, arrB + arrBSize, descending<int>);
- print(arrA, arrA + arrASize);
- print(arrB, arrB + arrBSize);
- std::cout << "Sorted arrays even/odd:\n";
- sort(arrA, arrA + arrASize, even<int>);
- sort(arrB, arrB + arrBSize, odd<int>);
- print(arrA, arrA + arrASize);
- print(arrB, arrB + arrBSize);
- std::cout << "Sorted arrays parity ordered: even-odd descending / odd-even ascending:\n";
- sort(arrA, arrA + arrASize, parityOrdered<int, even, odd, descending>);
- sort(arrB, arrB + arrBSize, parityOrdered<int, odd, even, ascending>);
- print(arrA, arrA + arrASize);
- print(arrB, arrB + arrBSize);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement