C++归并排序模板——支持lambda表达式,仿函数,迭代器

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_40946921/article/details/108574446