#include<iostream>
#include<vector>
using namespace std;
template<typename _Iter, typename _Pred>
void merge_sort(_Iter begin, _Iter end, _Pred pred) {
if (begin + 1 >= end)
return;
size_t size = distance(begin, end);
_Iter mid = begin + (size >> 1);
merge_sort(begin, mid, pred); //左右划分
merge_sort(mid, end, pred);
_Iter lbegin = begin;
_Iter rbegin = mid;
auto temp = new _Iter_value_t<_Iter>[size]; //用于合并两个有序序列
unsigned int index = 0;
while (lbegin != mid && rbegin != end) //对比首元素进行合并
temp[index++] = (pred(*lbegin, *rbegin) ? *(lbegin++) : *(rbegin++));
while (lbegin != mid) //如果左侧有剩余
temp[index++] = *(lbegin++);
while (rbegin != end)
temp[index++] = *(rbegin++);
index = 0;
while (begin != end) //使用合并后的序列对原数据进行修改
*(begin++) = temp[index++];
delete[]temp;
}
template<typename _Iter>
void merge_sort(_Iter begin, _Iter end) {
merge_sort(begin, end, less<_Iter_value_t<_Iter>>());
}
int main() {
vector<int> a{ 1,8,3,3,4,7,6,9,5 };
merge_sort(a.begin(), a.end());
return 0;
}