Skip to content

Instantly share code, notes, and snippets.

@sang4lv
Created January 22, 2017 07:15
Show Gist options
  • Save sang4lv/4375c2941f4b5410c11edbd4c5bc6cc0 to your computer and use it in GitHub Desktop.
Save sang4lv/4375c2941f4b5410c11edbd4c5bc6cc0 to your computer and use it in GitHub Desktop.
void merge_sort(vector<int> &a, int left, int right) {
// base case
if (left + 1 >= right) {
return;
}
// recursion case
int mid = (left + right) / 2;
merge_sort(a, left, mid);
merge_sort(a, mid, right);
// prepare left half for copy
int size = mid - left;
vector<vector<int>> v(size, vector<int>(2));
for (int i = 0; i < size; i++) {
v[i] = {a[left + i][0], a[left + i][1]};
}
// merge
int i = 0;
int j = mid;
int k = left;
while (i < size && j < right) {
if (v[i][1] <= a[j][1]) { // sort by ascending endpoints
a[k][0] = v[i][0];
a[k][1] = v[i][1];
k++;
i++;
} else {
a[k][0] = a[j][0];
a[k][1] = a[j][1];
k++;
}
}
while (i < size) {
a[k][0] = v[i][0];
a[k][1] = v[i][1];
k++;
i++;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment