質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

505閲覧

クイックソートプログラムについて

kannnn

総合スコア3

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2022/06/24 04:40

visual basic におけるクイックソートについて質問させていただきます。今回再起呼び出しを用いてクイックソートのプログラムを書きましたがエラー以前にフリーズして動かなくなる事象が発生しています。なお、今回は1~100000までの数字をランダムに20個生成することとし、そのプログラムは既に完成しています。以下作成したプログラムになります。修正よろしくお願いします。

Private Sub DivisionSort(minNo As Long, maxNo As Long) Dim i As Long = minNo Dim j As Long = maxNo Dim pivot As Integer = Data(Int((minNo + maxNo) / 2)) While i <= j While Data(i) < pivot And i < maxNo i = i + 1 End While While pivot < Data(j) And j > maxNo j = j - 1 End While Swap(i, j) End While If (minNo < j) Then DivisionSort(minNo, j) End If If (i < maxNo) Then DivisionSort(i, maxNo) End If End Sub Private Sub Swap(num1 As Integer, num2 As Integer) Dim temp As Integer temp = Data(num1) Data(num1) = Data(num2) Data(num2) = temp End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2022/06/24 06:31

永久ループしているのでしょう。 ステップ実行するなりしてデバッグしてはどうでしょうか
KOZ6.0

2022/06/24 07:37

パッと見ですが、引数を ByRef にしないと Swap が機能しないですね。 与える引数 i,j は Long なのに Integer になっているのも謎
KOZ6.0

2022/06/24 07:40

あ、ごめんなさい、上のコメントは勘違いです。
guest

回答1

0

ベストアンサー

こんな感じでどうでしょうか。

VB

1Private Data As Integer() = Enumerable.Range(1, 20).OrderBy(Of Guid)(Function(i As Integer) Guid.NewGuid()).ToArray() 2 3Sub Main() 4 Console.WriteLine(String.Join(",", Data.Select(Function(i As Integer) i.ToString()))) 5 DivisionSort(0, Data.Length - 1) 6 Console.WriteLine(String.Join(",", Data.Select(Function(i As Integer) i.ToString()))) 7 Console.ReadKey() 8End Sub 9 10Private Sub DivisionSort(minNo As Integer, maxNo As Integer) 11 Dim i As Integer = minNo 12 Dim j As Integer = maxNo 13 Dim pivot As Integer = Data((minNo + maxNo) \ 2) 14 Dim temp As Integer 15 Do 16 While Data(i) < pivot 17 i += 1 18 End While 19 While pivot < Data(j) 20 j -= 1 21 End While 22 23 If i >= j Then Exit Do 24 25 temp = Data(i) 26 Data(i) = Data(j) 27 Data(j) = temp 28 i += 1 29 j -= 1 30 Loop 31 If minNo < i - 1 Then 32 DivisionSort(minNo, i - 1) 33 End If 34 If j + 1 < maxNo Then 35 DivisionSort(j + 1, maxNo) 36 End If 37End Sub

実行結果
17,7,8,2,16,6,12,13,3,14,18,1,11,10,4,9,5,15,20,19
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

投稿2022/06/24 10:28

編集2022/06/28 22:20
KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kannnn

2022/06/28 01:58

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問