#ifndef MERGESORT #define MERGESORT #include #include template void Split(const std::vector & src, std::vector & a, std::vector & b){ size_t i; size_t mid = src.size() / 2; for(i = 0; i < mid; i++) { a.push_back(src[i]); } for(i = mid; i < src.size(); i++) { b.push_back(src[i]); } return; } template void Merge(std::vector & src, const std::vector & a, const std::vector & b){ size_t apos{0}, bpos{0}, spos{0}; while (apos < a.size() and bpos < b.size() ) { if (a[apos] < b[bpos]) { src[spos++] = a[apos++]; } else { src[spos++] = b[bpos++]; } } while ( apos < a.size()) { src[spos++] = a[apos++]; } while ( bpos < b.size()) { src[spos++] = b[bpos++]; } return; } template void MergeSort(std::vector & src) { std::vector a, b; if (src.size() > 1) { Split(src, a, b); MergeSort(a); MergeSort(b); Merge(src, a,b); } return; } #endif