c++ 归并排序 - 模板函数写法

归并排序 - 模板函数写法

// merge_sort.cpp
#include <iostream>
#include <vector>
#include "../head_file/template_head.h"

using namespace std;

void merge_sort()
{
	cout << "Merge Sort!!!" << endl;
	vector<int> list = { 8,9,1,7,2,3,5,4,6,0 };
	mergeSort(list.begin(), list.end());
	for (auto x : list) {
		cout << x << " ";
	}
	cout << endl;
	
}

template <typename Iterator>
void mergeSort(const Iterator& begin, const Iterator& end) {
	/*typedef decltype(*begin) item_type;
	cout << "type of item_type: " << typeid(item_type).name() << endl;
	cout << "we want to new a dynamic array" << endl;
	auto x = new int[end - begin + 1];
	cout << "type of x: " << typeid(x).name() << endl;*/
	mergeSort(begin, end, less_<decltype(*begin)>{});
}

template <typename Iterator, typename Comparator>
void mergeSort(const Iterator& begin, const Iterator& end, Comparator lessThan) {
	if (begin + 1 == end)  // 归并排序中,divide到只有一个元素就行了,即begin + 1 = end,
		return;
	auto size = end - begin;
	Iterator mid = begin + (size / 2);
	mergeSort(begin, mid, lessThan);
	mergeSort(mid, end, lessThan);
	merge(begin, mid, end, lessThan);
}

template <typename Iterator, typename Comparator>
void merge(const Iterator& begin, const Iterator& mid, const Iterator& end, Comparator lessThan) {
	/*typedef decltype(*begin) item_type;
	cout << "type of item_type: " << typeid(item_type).name() << endl;*/
	auto size = end - begin;
	auto merged_arr = new int[size + 1];  
	/* 
	typedef decltype(*begin) item_type;
	auto merged_arr = new item_type[size+1];   // 这里好像不太行,想要根据*begin的类型来分配动态内存。
	*/
	auto origin_arr = merged_arr;
	Iterator itr_a = begin, itr_b = mid;
	while (itr_a != mid && itr_b != end)
	{
		if (lessThan(*itr_a, *itr_b)) {
			*origin_arr = std::move(*itr_a);
			//*origin_arr = *itr_a;
			origin_arr++;
			itr_a++;
		}
		else
		{
			*origin_arr = std::move(*itr_b);
			//*origin_arr = *itr_b;
			origin_arr++;
			itr_b++;
		}
	}
	while (itr_a != mid)
	{
		// b中的数据已经用完了
		*origin_arr = std::move(*itr_a);
		//*origin_arr = *itr_a;
		origin_arr++;
		itr_a++;
	}
	while (itr_b != end)
	{
		// a中的数据已经用完了
		*origin_arr = std::move(*itr_b);
		//*origin_arr = *itr_b;
		origin_arr++;
		itr_b++;
	}

	origin_arr = merged_arr;
	for (auto i = begin; i != end; i++) {
		*i = std::move(*origin_arr);
		//*i = *origin_arr;
		origin_arr++;
	}
	delete[] merged_arr;
}
// template_head.h
template <class T> struct less_
{
	bool operator () (const T& x, const T& y) const { return x < y; }
	typedef T first_argument_type;
	typedef T secont_argument_type;
	typedef bool result_type;
};

/* 归并排序 */
template <typename Iterator>
void mergeSort(const Iterator& begin, const Iterator& end);

template <typename Iterator, typename Comparator>
void mergeSort(const Iterator& begin, const Iterator& end, Comparator lessThan);

template <typename Iterator, typename Comparator>
void merge(const Iterator& begin, const Iterator& mid, const Iterator& end, Comparator lessThan);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值