c++实现合并排序算法
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <functional>
#include <string>
#include <list>
using namespace std;
template<typename type, typename comparator = std::less<type>>
struct mergesort{
public:
typename typedef std::vector<type> arraytype;
typename typedef std::vector<type>::const_iterator constitrtype;
typename typedef std::vector<type>::difference_type difftype;
private:
arraytype values;
comparator compare;
public:
mergesort(){};
mergesort(const arraytype val,const comparator& cmp = comparator())
: values(val), compare(cmp){}
mergesort(const type* begin, const type* end, const comparator& cmp = comparator())
: values(begin,end), compare(cmp) {}
arraytype doit(){ return _sortit(values.begin(), values.end()); }
private:
//helper function
arraytype _sortit(constitrtype begin, constitrtype end)const{
if(end - begin < 2) return arraytype(begin,end);
arraytype left, right;
difftype mid = (end-begin) / 2;
left = _sortit(begin, begin + mid );
right = _sortit(begin + mid , end );
return _mergesort(left,right);
}
arraytype _mergesort(const arraytype& leftarray, const arraytype& rightarray)const{
arraytype lhs(leftarray);
arraytype rhs(rightarray);
arraytype result;
while(!lhs.empty() && !rhs.empty()){
type elem = compareelem(lhs.front(),rhs.front());
if(elem == lhs.front() ) lhs.erase(lhs.begin());
else rhs.erase( rhs.begin() );
result.push_back( elem );
}
std::copy(lhs.begin(),lhs.end(), std::back_insert_iterator<arraytype>(result) );
std::copy(rhs.begin(),rhs.end(), std::back_insert_iterator<arraytype>(result) );
return result;
}
type compareelem(const type& lhs, const type& rhs)const{
return compare(lhs,rhs) ? lhs : rhs;
}
};
template<typename input>
void println(const input& in){
cout << in << endl;
}
int main(){
srand( static_cast<unsigned>(time(0)) );
const int size = 7;
int values[size] = {0};
std::generate( values, values + size, rand );
mergesort<int > msort(values,values+size);
vector<int> sorted = msort.doit();
cout <<"using std::less as comparison :\n";
std::for_each( sorted.begin(), sorted.end(),println<int>);
mergesort<int, std::greater<int> > greatersort(values,values +size);
vector<int> greatersorted = greatersort.doit();
cout << "\n\nusing std::greater as comparison : \n";
std::for_each( greatersorted.begin(), greatersorted.end(), println<int> );
return 0;
}
