归并排序 - 模板函数写法
#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) {
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)
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) {
auto size = end - begin;
auto merged_arr = new int[size + 1];
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++;
}
else
{
*origin_arr = std::move(*itr_b);
origin_arr++;
itr_b++;
}
}
while (itr_a != mid)
{
*origin_arr = std::move(*itr_a);
origin_arr++;
itr_a++;
}
while (itr_b != end)
{
*origin_arr = std::move(*itr_b);
origin_arr++;
itr_b++;
}
origin_arr = merged_arr;
for (auto i = begin; i != end; i++) {
*i = std::move(*origin_arr);
origin_arr++;
}
delete[] merged_arr;
}
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);