コード例 #1
0
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;
}
コード例 #2
0
      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);
           }  
      };
コード例 #3
0
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);
}
コード例 #4
0
int main() {
      
    read();
 
    _MergeSort(0, n-1);

    write();
   
    return(0);
}