Facebook
From Flying Motmot, 6 Years ago, written in C++.
This paste is a reply to MergeSort from Sharp Giraffe - go back
Embed
Viewing differences between MergeSort and Re: MergeSort
#include 
#include 
#include 
#include 
using namespace std;

void merge(vector a, int p, int q, int r) {
  //defining well named variables
  int range = r - p + 1;

  int lowHalf = q - p + 1;
  int highHalf = r - q;

  int rStart = q + 1;
  int rEnd = r;
  int lStart = p;
  int lEnd = q;

  //filling temp array
  std::vector temp;
  for (int i = 0; i < range; i++) {
    temp.push_back(a[lStart + i]);
  }

  //mergin subarrays
  int left = lStart;
  int right = rStart;
  int k = 0; //index
  while( (left <= lEnd) && (right <= rEnd)) {
    if(a[left] <= a[right]) {
      temp[k] = a[left];
      left++;
    } else {
      temp[k] = a[right];
      right++;
    }
    k++;
  }

  //coping rest of subarrays
  while (right <= rEnd) {temp[k++] = a[right++];}
  while (left <= rEnd) {temp[k++] = a[left++];}

  //coping temp array to origin
  for (int i = 0; i < range; i++) {
    a[lStart + i] = temp[i];
  }

}
void mergeSortRec(vector arr, int l, int r) {
  int p;
  if(l < r) {
    p = (l+r)/2;
    mergeSortRec(arr, l, p);
    mergeSortRec(arr, p+1, r);
    merge(arr, l,p, r);
  }
}

void mergeSortIter(vector arr, int l, int r) {
  int n = r - l - 1;
  int size;
  int start;

  for (size = 1; size <= n; size *= 2) {
    for (start = 0; start < n; start += 2*size) {
      //index of left end
      int mid = start + size - 1;
      //are we out of the bound?
      int end = min(start + 2*size - 1, n);

      merge(arr, start, mid, end);
    }
  }
}

void merge_sort_time(vector v) {
  auto start = chrono::high_resolution_clock::now();
  mergeSortRec(v,0,v.size()-1);
  auto end = chrono::high_resolution_clock::now();
  chrono::duration elapsed = end - start;
  std::cout << elapsed.count() << endl;
}

auto main(int argc, char const *argv[]) -> int
{
  ios_base::sync_with_stdio(false);
  int x;
  vector v;

  // getting inputs
  while(cin >> x)
  {
    v.push_back(x);
    cin.clear();
    cin.sync();
    std::cout << "One" << '\n';
  }
  // vector sorted = selection_sort(v);
  // printVector(sorted);
  merge_sort_time(v);
}