@JoachimPileborgによって答えはもちろん動作しますが、あなたが単独でリンクされ、独自のメンバ関数sort
を記述する必要はありませんのでご注意します選択ソートを行うためのリスト。
#include <algorithm> // min_element, iter_swap, is_sorted
#include <cassert> // assert
#include <forward_list> // forward_list
#include <functional> // less
#include <iostream> // cout
#include <ios> // boolalpha
#include <iterator> // distance, next
template<class FwdIt, class Compare = std::less<>>
void selection_sort(FwdIt first, FwdIt last, Compare cmp = Compare{})
{
for (auto it = first; it != last; ++it) {
auto const selection = std::min_element(it, last, cmp);
std::iter_swap(selection, it);
assert(std::is_sorted(first, std::next(it), cmp));
}
}
int main()
{
auto fl = std::forward_list<int> { 2, 4, 1, 0, -1, 8, 2 };
std::cout << std::boolalpha << std::is_sorted(fl.begin(), fl.end()) << '\n';
for (auto const& e : fl) std::cout << e << ", "; std::cout << '\n';
selection_sort(fl.begin(), fl.end());
std::cout << std::boolalpha << std::is_sorted(fl.begin(), fl.end()) << '\n';
for (auto const& e : fl) std::cout << e << ", "; std::cout << '\n';
}
Live Example:
理由はselection_sort
(複雑O(N^2)
有する)のgeneric versionは、標準ライブラリからの1つ、std::forward_list
として前方反復子を公開既に適合する任意単独でリンクされたリストであることです
std::forward_list
も独自のメンバ関数sort
を実装しています。 O(N log N)
マージソートを行うこのバージョンは、公開インターフェイスだけに基づいて実装することはできません(実際には可能ですが、forward_list
が保証するO(1)
ストレージの代わりにO(N)
余分なストレージを使用します)。
Joachimありがとう、私のコードは今すぐ完璧に動作します! :) – Didem