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

本文深入探讨了使用C++模板元编程实现的归并排序算法,该算法支持自定义比较函数,适用于多种数据类型。通过递归地将序列分为两部分,然后合并已排序的部分,实现了高效的数据排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值