RandIter _MergeSort(RandIter first, RandIter mid, RandIter last, SortPred pred) { if (first < mid) { // At least two elements // Divide and conquer _MergeSort(first, first + (mid - first) / 2, mid, pred); _MergeSort(mid, mid + (last - mid) / 2, last, pred); // Merge using ValueT = typename std::iterator_traits<RandIter>::value_type; std::vector<ValueT> part1(first, mid); std::vector<ValueT> part2(mid, last); std::merge(part1.begin(), part1.end(), part2.begin(), part2.end(), first, pred); #ifndef NDEBUG std::cout << "[ "; PrintSeq(first, mid, false); std::cout << "]" << " + [ "; PrintSeq(mid, last, false); std::cout << "] --> [ "; PrintSeq(first, last, false); std::cout << "]\n"; #endif } return first; }
int _MergeSort(int li, int ls) { if(li==ls) return vec[ li ]; else { int middle = (li+ls)>>1; _MergeSort(li, middle); _MergeSort(middle + 1, ls); _merge(li, middle, ls); } };
RanIt MergeSort(RanIt first, RanIt last, Pred cmp) { #ifndef NDEBUG std::cout << __func__ << ": "; PrintSeq(first, last); #endif return _MergeSort(first, first + (last - first) / 2, last, cmp); }
int main() { read(); _MergeSort(0, n-1); write(); return(0); }