fork download
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. template <typename T,typename Comparator = std::less<int>>
  6. void mergeSort(T* arr, size_t start, size_t end, Comparator cmp = Comparator())
  7. {
  8. if (end - start < 2)
  9. return;
  10. if (end - start == 2)
  11. {
  12. if (cmp(arr[start + 1], arr[start]))
  13. swap(arr[start], arr[start + 1]);
  14. return;
  15. }
  16. mergeSort<T>(arr, start, start + (end - start) / 2, cmp);
  17. mergeSort<T>(arr, start + (end - start) / 2, end, cmp);
  18. size_t auxSize = end - start;
  19. T* aux = new T[auxSize];
  20. size_t b1 = start;
  21. size_t e1 = start + (end - start) / 2;
  22. size_t b2 = e1;
  23. size_t auxCurrentIndex = 0;
  24. while (auxCurrentIndex < end - start)
  25. {
  26. if (b1 >= e1 || (b2 < end && cmp(arr[b2], arr[b1])))
  27. {
  28. aux[auxCurrentIndex] = arr[b2];
  29. ++b2;
  30. }
  31. else
  32. {
  33. aux[auxCurrentIndex] = arr[b1];
  34. ++b1;
  35. }
  36. auxCurrentIndex++;
  37. }
  38. for (size_t i = start; i < end; ++i)
  39. arr[i] = aux[i - start];
  40. }
  41.  
  42. int main()
  43. {
  44. int a[10] = {5, 4, 0, 9, 6, -10, 10, 9, 3, -2};
  45. mergeSort<int>(a, 0, 10);
  46. for (std::size_t i = 0; i < 10; i++){
  47. std::cout << a[i] << ' ';
  48. }
  49. cout << "\n\n";
  50. mergeSort<int,std::greater<int>>(a, 0, 10);
  51. for (std::size_t i = 0; i < 10; i++){
  52. std::cout << a[i] << ' ';
  53. }
  54. }
  55.  
Success #stdin #stdout 0s 4352KB
stdin
Standard input is empty
stdout
-10 -2 0 3 4 5 6 9 9 10 

10 9 9 6 5 4 3 0 -2 -10