G.cpp 948 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void merge_two(vector<int> &v, int p, int mid, int q) {
  4. vector<int> left(v.begin() + p, v.begin() + mid + 1);
  5. vector<int> right(v.begin() + mid + 1, v.begin() + q + 1);
  6. left.push_back(INT_MAX);
  7. right.push_back(INT_MAX);
  8. int ll = 0, rr = 0;
  9. for (int i = p; i <= q; i++) {
  10. if (left[ll] <= right[rr]) {
  11. v[i] = left[ll++];
  12. } else {
  13. v[i] = right[rr++];
  14. }
  15. }
  16. }
  17. void merge_sort(vector<int> &a, int p, int q) {
  18. if (p >= q)return;
  19. int mid = (p + q) >> 1;
  20. merge_sort(a, p, mid);
  21. merge_sort(a, mid + 1, q);
  22. merge_two(a, p, mid, q);
  23. }
  24. int main() {
  25. int n;
  26. cin >> n;
  27. vector<int> a(n);
  28. for (auto &e:a)cin >> e;
  29. merge_sort(a, 0, n - 1);
  30. cout << a[0];
  31. for (int i = 1; i < a.size(); i++)
  32. cout << " " << a[i];
  33. cout << endl;
  34. return 0;
  35. }