C++11以上ネットで少しだけ話題になったネタ系ソートアルゴリズムのスターリンソート(というかフィルター?)をC#とC++で実装してみようと思います。改造してみるなんでスターリンソートなのか?最後にスターリンソートとは?まず、スターリンソートの簡単な説明です。スターリンソートは、ソートアルゴリズムの一種(自称)で計算量はなんとO(n)です。N個の配列であれば、おおよそ、配列を末尾から先頭までを1回だけ巡回するとソートが完了するアルゴリズムらしいです。n)回計算しないとソートできませんがそれらに比べ圧倒的に高速です。(本来ならあり得ないはず!)C#の実装ではまずは、一番よく使うC#で確認と実装してきます。オリジナルの実装GitHubで元のコードが公開されているので引用します。sortedArray));}このコードは実行すると以下のように出力されます。9ネタバレになりますが、ソートじゃないじゃん!!という突っ込みはさておき、共産主義圏でよくある(?)「粛清」によって数列がソート(≒フィルター)されました。直前に出現した数値より小さい値が後続に出現すると粛清を行いソートを実行しています。改造してみるこのアルゴリズムですが、int配列しか対応していないので、「自作オブジェクトのソート機能拡張」と、運搬性を持たせるために「クラス化」してみようと思います。長いですが以下の通りです。}}C#の配列などのリスト要素はおおむねIEnumerableで統一して扱えるため引数および戻り値をこれに変更します。ジェネリックに指定したTをint型へ変換する変換規則を述語によって指定します。速度が低下しますが、述語に指定したラムダによって比較が可能になるので同じ結果がオブジェクト配列からも得られます。次に、ゲーム制作で使用してるC++で実装します。オリジナルの実装こちらも、GitHubで元のコードが公開されているので引用します。0;}実行すると以下数列を画面に出力します。9C#版は'>='でC++版は'>'なんですね...(汗それはさておき、こちらも大粛清が起きて数列がソートされました。改造してみるこちらも、int配列しか対応していないので、「自作オブジェクトのソート機能拡張」と、運搬性を持たせるために「クラス化」してみようと思います。0;}作ってて思ったのですが、double型とかはintへの変換いらないので特殊化しておくべきでしたね...こちらは、C#版と同じ方式と、三方比較演算子で比較自体を外に出す方式を実装してみました。後述のほうはオブジェクトをintに変換する処理が結構呼ばれるので前者に比べると少し効率が悪いかもしれません?wなんでスターリンソートなのか?スターリンさん「大粛清」で有名みたいです。ネット掲示板でめちゃくちゃ浅いレベルでしか知らなかったのですがこれはヤバいですね。Wikipedia最後にちょっとした笑いと歴史の勉強になりました。»Profile受託ソフト会社員でWin系業務屋。趣味でCocos2d-x/C++を触っています。etc...主に受託・開発ネタ、Windowsの事、Srellaris、ゲーム制作の進捗の事を喋ります。Core3.xとUnityでAES暗号化を利用するC#の標準機能でデータを圧縮・展開するC#で属性を利用して処理に制約の説明を追加するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。