- 締切済み
VB Shell sort
初心者です。 シェルソート後の数字がうまく表示できません。 見よう見まねでしているので、どこがどうおかしいのかわかりません。 大変、恐縮ですが宜しくお願いいたします。 ----------------------------------------- Public Class Form1 Dim intNumber() As Integer = {2, 6, 4, 8, 10, 12, 89, 45, 37} Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Display unsorted numbers to lists For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub Sub btnSort2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort2.Click Dim i As Integer, j As Integer, k As Integer Dim temp As Integer Dim gap As Integer Dim count As Integer gap = count / 2 Do While gap > 0 k = 0 Do While k < gap j = k + gap Do While j < count i = j - gap Do While i >= k If intNumber(i + gap) > intNumber(i) Then temp = intNumber(i + gap) intNumber(i + gap) = intNumber(i) intNumber(i) = temp Else Exit Do End If i = i - gap Loop j = j + gap Loop k = k + 1 Loop gap = gap / 2 Loop 'Display numbers to list lstShell.Items.Clear() For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub End Class
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
一応動作はしますが、 > Dim intNumber() As Integer = {2, 6, 4, 8, 10, 12, 89, 45, 37} これを例えば Dim intNumber() As Integer = {2, 6, 4, 8, 10, 12, 89, 45, 37, 51, 13, 63, 34} 等と変更したとします。 現行のままでは期待通りに動作しません。 あちらこちら修正しないといけないですよね。 > For i As Integer = 0 To 8 > Dim count As Integer = 9 このような直接数値を記入するのはできるかぎり避けましょう。 VBなら UBound関数で配列の添字の最大が求められます。 For i As Integer = 0 To UBound(intNumber) Dim count As Integer = UBound(intNumber) +1 等とすれば、intNumberだけ変更すれば関連する箇所が全部変わります。 同様の理由で、折角最初のプログラムで変数countを使っていたのに、修正版で > gap = 9 / 2 > Do While j < 9 と直接 9 と入れてしまっているのは改悪です。
- kmee
- ベストアンサー率55% (1857/3366)
> Dim count As Integer > gap = count / 2 countに値が入っていません。
お礼
どうしようもないミスを指摘していただき、ありがとうございました。 色々と手直しして、やっとソート出来ました。大変、感謝いたします。 ----- Public Class Form1 Dim intNumber() As Integer = {2, 6, 4, 8, 10, 12, 89, 45, 37} Dim i As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Display unsorted numbers to lists For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub Sub btnSort2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort2.Click Dim z As Integer, j As Integer, k As Integer Dim temp As Integer Dim gap As Integer Dim count As Integer = 9 gap = 9 / 2 Do While gap > 0 k = 0 Do While k < gap j = k + gap Do While j < 9 z = j - gap Do While z >= k If intNumber(z + gap) < intNumber(z) Then temp = intNumber(z + gap) intNumber(z + gap) = intNumber(z) intNumber(z) = temp Else Exit Do End If z = z - gap Loop j = j + gap Loop k = k + 1 Loop gap = gap / 2 Loop 'Display numbers to list lstShell.Items.Clear() For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub End Class
お礼
詳しい説明でわかりやすくご教示いただき、ありがとうございました。 VBのクラスを週一で大学で1月から受講していますが、まだ、勉強不足で、 全くの素人なのに、ShellとBubble Sortの課題が出てしまい、 焦っていました。VBの基本的なこともまだ理解できていないので、 すごく、勉強になりました。大変ありがとうございました。