---
tags: codebook
---
{%hackmd theme-dark %}
# merge sort(subscript)
```cpp=
#include<iostream>
#include<vector>
using namespace std;
//額外空間版本O(nlogn)+M(n)
void merge_sort(vector<long long>&v, size_t l, size_t r) {
//終止條件
if (r - l < 2) return;
//分割split
size_t mid = (l + r) / 2;
vector<long long> lsub(v.begin() + l, v.begin() + mid);
vector<long long> rsub(v.begin() + mid, v.begin() + r);
//遞迴recursion
merge_sort(lsub, 0, lsub.size());
merge_sort(rsub, 0, rsub.size());
//歸併merge
size_t lpivot = 0, rpivot = 0;
while (lpivot != lsub.size() && rpivot != rsub.size()) {
if (lsub[lpivot] < rsub[rpivot])
v[l] = lsub[lpivot], l++, lpivot++;
else
v[l] = rsub[rpivot], l++, rpivot++;
}
while (lpivot != lsub.size())
v[l] = lsub[lpivot], l++, lpivot++;
while (rpivot != rsub.size())
v[l] = rsub[rpivot], l++, rpivot++;
}
int main() {
vector<long long> vec{1, 5, 4, 2, 0, 3, 7, 6, 9, 8};
merge_sort(vec, 0, vec.size());
for (vector<long long>::iterator i = vec.begin(); i != vec.end(); i++)
cout << *i << ' ';
return 0;
}
```