Advertisement
Guest User

Untitled

a guest
Dec 16th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.43 KB | None | 0 0
  1. #include<cstdio>
  2. #include<iostream>
  3. template<typename T> void Swap(T& elem1, T& elem2) {
  4. T other = elem1;
  5. elem1 = elem2;
  6. elem2 = other;
  7. }
  8.  
  9. template <typename T> class Point {
  10. public:
  11. T val;
  12. Point *next;
  13. Point(T val) {
  14. this->val = val;
  15. next = NULL;
  16. }
  17. };
  18.  
  19. template<typename T> class List {
  20. public:
  21. const size_t size() {
  22. return size_val;
  23. }
  24.  
  25. List() {
  26. size_val = 0;
  27. left = NULL;
  28. right = NULL;
  29. }
  30.  
  31. ~List() {
  32. Point<T> *cur = left, *cur1;
  33. while (cur != NULL) {
  34. cur1 = cur;
  35. cur = cur->next;
  36. delete(cur1);
  37. }
  38. }
  39.  
  40. void Add(T& val) {
  41. if (right == NULL) {
  42. right = new Point<T>(val);
  43. left = right;
  44. size_val = 1;
  45. } else {
  46. right->next = new Point<T>(val);
  47. right = right->next;
  48. ++size_val;
  49. }
  50. }
  51.  
  52. Point<T>* begin() const {
  53. return left;
  54. }
  55.  
  56. Point<T>* end() const {
  57. return right;
  58. }
  59.  
  60. private:
  61. Point<T> *left, *right;
  62. size_t size_val;
  63. };
  64.  
  65. template <typename T> std::ostream& operator << (std::ostream& out, const List<T> &ans) {
  66. auto cur = ans.begin();
  67. while (cur != ans.end()) {
  68. out << cur->val << ' ';
  69. cur = cur->next;
  70. }
  71.  
  72. out << ans.end()->val;
  73. return out;
  74. }
  75.  
  76. template <typename T> void Sort(Point<T> *first, Point<T> *last) {
  77. if (first == last)
  78. return;
  79.  
  80. if (first->next == last) {
  81. if (first->val > last->val) {
  82. Swap(first->val, last->val);
  83. }
  84. return;
  85. }
  86.  
  87. size_t length_first = 1, length_second = 1;
  88. Point<T> *cur, *mid1, *mid2, *cur1, *cur2, *fail;
  89. for (cur = first; cur != last; ++length_first) {
  90. cur = cur->next;
  91. }
  92.  
  93. for (cur = first; length_second != length_first / 2; ++length_second) {
  94. cur = cur->next;
  95. }
  96.  
  97. mid1 = cur;
  98. mid2 = cur->next;
  99. Sort(first, mid1);
  100. Sort(mid2, last);
  101.  
  102.  
  103. cur = first;
  104. cur1 = first->next;
  105. cur2 = mid2;
  106. fail = mid1->next;
  107. while ((cur1 != fail) || (cur2 != last)) {
  108. if ((cur2 == last) || ((cur1 != fail) && (cur1->val <= cur2->val))) {
  109. cur->next = cur1;
  110. cur1 = cur1->next;
  111. cur = cur->next;
  112. } else {
  113. cur->next = cur2;
  114. cur2 = cur2->next;
  115. cur = cur->next;
  116. }
  117. }
  118.  
  119. cur->next = last;
  120. cur = first;
  121. while ((cur->next != last) && (cur->next->val < cur->val)) {
  122. Swap(cur->next->val, cur->val);
  123. cur = cur->next;
  124. }
  125.  
  126. T max_val = last->val;
  127. for (cur = first; cur != last; cur = cur->next) {
  128. if (cur->val > max_val) {
  129. Swap(cur->val, max_val);
  130. }
  131. }
  132.  
  133. last->val = max_val;
  134. }
  135.  
  136.  
  137. int main() {
  138. freopen("input.txt", "r", stdin);
  139. freopen("output.txt", "w", stdout);
  140. int n, val;
  141. List<int> input_file;
  142. std::cin >> n;
  143. for (int i = 0; i < n; ++i) {
  144. std::cin >> val;
  145. input_file.Add(val);
  146. }
  147.  
  148. Sort(input_file.begin(), input_file.end());
  149.  
  150. std::cout << input_file << "\n";
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement