新しいC++は古いC++とは別物になる事は周知の通りです。
そこで、モダンだと私が思う方法でマージソートを実装してみようと思います。
(独学および規格書までは読んでないにわかなので、あくまでもモダンっぽい何かです)
ま、std::mergeを使うだけですが
mergesort.cpp
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
template<typename T>
std::vector<T> merge_sort(typename std::vector<T>::iterator begin, typename std::vector<T>::iterator end){
if(begin + 1 >= end)
return std::vector<T>(begin, end);
auto size = end - begin;
auto mid = size / 2;
std::vector<T> result;
result.reserve(size);
std::vector<T> left = merge_sort<T>(begin, begin + mid);
std::vector<T> right = merge_sort<T>(begin + mid, end);
std::merge(left.begin(), left.end(),
right.begin(), right.end(),
std::back_inserter(result));
return result;
}
int main(){
using std::vector;
using std::cin, std::cout, std::endl;
vector<int> input;
int size;
cout << "size:";
cin >> size;
input.reserve(size);
std::copy_n(std::istream_iterator<int>(cin), size, std::back_inserter(input));
cout << input[0];
std::for_each(std::begin(input) + 1, std::end(input),
[](int x){ cout << "," << x ;}
);
cout << endl;
auto res = merge_sort<int>(input.begin(), input.end());
cout << res[0];
std::for_each(std::begin(res) + 1, std::end(res),
[](int x){ cout << "," << x ;}
);
cout << endl;
}
std::mergeの仕様のせいで内部ソートじゃないのが若干気にはなりますね。
std::copy_nでn個の要素をcin
からvector
へ入力できるテクニックはなかなか便利なのではないでしょうか
n個の要素まではソート済みだからそれ以降をマージソートしてくれ みたいな関数があると便利っぽい気がしますね
なおusing
宣言をカンマ区切りで複数同時に行っているのでc++1zを指定しないと怒られます。
もっとモダンに美しく書けるor内部ソートをカッコよく書ける手段があるのならば教えて頂けると幸いです。