
ご多忙中申し訳ありません。
Dim data As New List(Of Integer)で型指定した、dataの数値を単純に、下記のコードのようにdata.Sort() で並べ替えをしても綺麗に並べ替えが出来ますが、殆どのサイトでは、このような使い方をせず、IComparerインターフェイスを実装したクラスを使ったり、又はバブルソートなどを使って並べ替えをしていますが。
単純にdata.Sort() のような、並べ替えは問題があるのでしょうか、大変恐縮ですがご教示ください。
FormにButtonとListBoxを貼り付けました。
Dim data As New List(Of Integer) 'Integer型にする。
Private Sub f() Handles MyBase.Load
'データをaddする。
data.Add(235)
data.Add(4)
data.Add(567)
data.Add(53)
data.Add(56)
data.Add(87943)
data.Add(43)
data.Add(890)
data.Add(342)
data.Add(56)
data.Add(64)
data.Add(5)
data.Add(0)
ListBox1.Items.Clear()
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim i As Integer
Dim dtcnt As Integer 'リストの数の変数。
dtcnt = data.Count 'リストの数を取得してループの回数に使う。
data.Sort() '並べ替え
For i = 0 To dtcnt - 1
ListBox1.Items.Add(data(i)) 'テストの結果をリストボックスに表示。
Next 'ListBox1には綺麗に並べ替えが完了して表示されています。
End Sub
何卒宜しくお願いします。
No.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 を使用します。」とありますから、クイックソートでしょう。
たびたびのお返事有難うございました。
とてもわかりやすい説明でした。
まだまだ、わからないことだらけですので、これからも宜しくお願いします。
本当に有難う御座いました。
No.2
- 回答日時:
「安定」とはここにある意味です。
「並び換えができないことがある」という意味ではありません。
例えば
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番目が同じだったら、最初に登場したものを使う」という処理をしたければ、順番が変わる可能性のある「安定でない」ソートは使えません。
この回答への補足
「いろいろなソートアルゴリズム」
http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/al …
ここのサイトにクイックソートの図解説明が載っていましたので、少しイメージしましたが、クイックソートの場合、下記のような、項目が一列の数値では問題がないように思えるのですが、間違っているでしょうか?
例
23
1
641
1
1
368
5
のように、単純な一列の数字の羅列です。
1が3箇所ありますが、どの位置の1かは、わからなくても構わないという前提です。
kmeeさんへ、再度のお返事有難う御座います。
「安定」、「不安定」の意味は、kmeeさんが例を示してくださったおかげで、「1番目の項目が間違った並び替えになる可能性がある」という、私の間違った考え方は訂正されました。
少し調べているうちに、またもや疑問点が生じてしまいました。
#リスト.Sort() とした場合は、なにやら「クイックソート」になるようなニュアンスで書かれていたよううですが、本当にそうなんでしょうか?
#kmeeさんが、教えてくださった。URLによると、クイックソートは「不安定」のようですが。(kmeeさんが、例で示してくださったようになる)
リスト.Sort() ←のリストの部分をIntegerで型指定した場合でも、やはりクイックソートになるのでしょうか?
#リスト.Sort() がクイックソートで不安定の場合、項目が下記のように、1列の場合は、リスト.Sort() で並び替えをしても問題はないのでしょうか?
例
23
641
1
368
5
のように、単純な一列の数字の羅列です。
ご多忙中、何度もすいません。ご教示いただければ幸いです。
No.1
- 回答日時:
・単純な数値で無い場合など、「大小」関係が定義されていないので、引数無しの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を使うと便利~勉強できないので、使わない
ごもっともなご意見だと思います、バブルソートなどは非常に簡単な原理ですけど、私のような無能な人間には、教えてもらわなければ、なかなか気がつきません。
わかりやすい、お返事有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- その他(Microsoft Office) Excel 2列分のDATAの並べ替え 1 2023/01/01 17:12
- UNIX・Linux UbuntuにROSをインストールしたい 1 2023/03/06 12:28
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- PHP PHPSpreadsheetによる書き出し時のページネーション方法について 1 2023/03/20 10:35
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# DataTableの行をソートしてD...
-
C言語・要素除去
-
System.IO.Directory.GetFiles...
-
2次元配列を複数項目でソートし...
-
javaのソートについて。
-
Excel VBA で別シートにデータ...
-
n番目に大きい数を求めるアル...
-
Excel VBAで並べ替えをしたい
-
excel VBA の条件をつけての列...
-
GridViewで列のソートを無効に...
-
C# ArrayListを二次元配列のよ...
-
ファイル名「1.jpg ~10.jpg~...
-
(VBA) Dir 関数で取得するファ...
-
C言語について
-
csvファイル内にてソートす...
-
C# DataGridView のヘッダーセ...
-
数字文字列のソート方法
-
VB.net データセットからのCSV...
-
C言語の一次元配列に関する問題...
-
VB.NETでソートされたデータセ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VBA基本構文の作り方 2列の...
-
C言語・要素除去
-
C# DataTableの行をソートしてD...
-
VB.NETでファイル名順にファイ...
-
構造体配列の並べ替え
-
あるディレクトリ内のファイル...
-
配列の問題
-
10個の整数を入力して小さい順...
-
2次元配列を複数項目でソートし...
-
構造体のリストをソートしたい。
-
DataGridViewソート時に先頭行...
-
DataGridViewのソートを止めたい
-
datagridviewの並べ替え
-
C++ 入力した3つのint型の整数...
-
DataGridViewの複数列を連動し...
-
Excelですべての組合せ(重複組...
-
C#のリストボックスで、クリッ...
-
VBScriptで重複レコードを削除...
おすすめ情報