- ベストアンサー
コレクションの数値をSortで並び替える方法について
- コレクションの数値をSortで並び替える方法を紹介します。
- data.Sort()を使用する方法の問題点について解説します。
- IComparerインターフェイスを実装したクラスやバブルソートを使用することが推奨されています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
安定/安定でない が問題になるのは、次の場合です。 (1)並び順としては同順位になる、別の値が存在する。 #2の例で 2,11 2,12 等のようなものです (2)ソート前の並び順に依存する処理が必要 #2の例の「1番目が同じだったら、最初に登場したものを使う」というようなものです 逆に言えば ・全て違う順位 ・同順位のものは全て同じ値(入れ替わってもわからない) ・ソート前の並び順は関係無い処理しかしない 場合には、安定性は関係ありません。 > #リスト.Sort() がクイックソートで不安定の場合、項目が下記のように、1列の場合は、リスト.Sort() で並び替えをしても問題はないのでしょうか? この場合 ・「お礼」欄にあった例では、そもそも同順位のものが無い。 ・「補足」欄にあった例では、並び順で同順位になるもの[1]は、すべて「1」という区別のつかない値。 なので、安定性は関係ありません。 > #リスト.Sort() とした場合は、なにやら「クイックソート」になるようなニュアンスで書かれていたよううですが、本当にそうなんでしょうか? 「このメソッドは、QuickSort アルゴリズムを使用する System.Array.Sort を使用します。」 とあるから、クイックソートでしょう。 > リスト.Sort() ←のリストの部分をIntegerで型指定した場合でも、やはりクイックソートになるのでしょうか? List.SortでもList(of T).Sortでも「このメソッドは、QuickSort アルゴリズムを使用する System.Array.Sort を使用します。」とありますから、クイックソートでしょう。
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88 「安定」とはここにある意味です。 「並び換えができないことがある」という意味ではありません。 例えば 2,12 1,10 2,13 2,11 を1番目の要素だけで並び変えれば、2,12 2,13 2,11は全て「同じ値」になります。 この「同じ値」のものが、ソート前と同じ順番であることが保証されているのが「安定」です。この例で言えば「2,12 2,13 2,11」となることが保証されます。 「安定でない」というのは、この順番が保証されない、ということです。「2,11 2,12 2,13」になるかもしれないし「2,13 2,12 2,11」になるかもしれない、ということです。 やりたいことによっては、安定であることが求められます。 例えば、この例で「1番目が同じだったら、最初に登場したものを使う」という処理をしたければ、順番が変わる可能性のある「安定でない」ソートは使えません。
お礼
kmeeさんへ、再度のお返事有難う御座います。 「安定」、「不安定」の意味は、kmeeさんが例を示してくださったおかげで、「1番目の項目が間違った並び替えになる可能性がある」という、私の間違った考え方は訂正されました。 少し調べているうちに、またもや疑問点が生じてしまいました。 #リスト.Sort() とした場合は、なにやら「クイックソート」になるようなニュアンスで書かれていたよううですが、本当にそうなんでしょうか? #kmeeさんが、教えてくださった。URLによると、クイックソートは「不安定」のようですが。(kmeeさんが、例で示してくださったようになる) リスト.Sort() ←のリストの部分をIntegerで型指定した場合でも、やはりクイックソートになるのでしょうか? #リスト.Sort() がクイックソートで不安定の場合、項目が下記のように、1列の場合は、リスト.Sort() で並び替えをしても問題はないのでしょうか? 例 23 641 1 368 5 のように、単純な一列の数字の羅列です。 ご多忙中、何度もすいません。ご教示いただければ幸いです。
補足
「いろいろなソートアルゴリズム」 http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/ ここのサイトにクイックソートの図解説明が載っていましたので、少しイメージしましたが、クイックソートの場合、下記のような、項目が一列の数値では問題がないように思えるのですが、間違っているでしょうか? 例 23 1 641 1 1 368 5 のように、単純な一列の数字の羅列です。 1が3箇所ありますが、どの位置の1かは、わからなくても構わないという前提です。
- kmee
- ベストアンサー率55% (1857/3366)
・単純な数値で無い場合など、「大小」関係が定義されていないので、引数無しのSortが使えない。 ・大小関係を自分で定義したものにしたい。文字列を最初の4文字目を無視して並び換える、等 ・Sortで使われているアルゴリズムがわからないので、確実に安定ソートをしたい場合は自分で用意する。 ・Sortを使うと便利だが、ソートの原理が勉強できないので、使わない あたりが考えられます。
お礼
早速のお返事有難う御座います。 >単純な数値で無い場合など、「大小」~引数無しのSortが使えない。 この場合ですと、確かにSortには無理があります。 >大小関係を自分で定義したものに~文字目を無視して並び換える この場合もSortを使って並び替えすならば、 If CInt(data(l2).Substring(3, txt)) < CInt(data(l2 + 1).Substring(3, txt)) Then こんな感じで、バブルソートしたほうが、早いですね。 >Sortで使われているアルゴリズム~ソートをしたい場合は自分で用意 Sortは安定した結果は得られない、ということでしょうか? >Sortを使うと便利~勉強できないので、使わない ごもっともなご意見だと思います、バブルソートなどは非常に簡単な原理ですけど、私のような無能な人間には、教えてもらわなければ、なかなか気がつきません。 わかりやすい、お返事有難うございました。
お礼
たびたびのお返事有難うございました。 とてもわかりやすい説明でした。 まだまだ、わからないことだらけですので、これからも宜しくお願いします。 本当に有難う御座いました。