2016-03-22 14 views
1

私は最近、ビジュアルベーシックで選択ソートプログラムを作成しようとしていました。私は配列の整数を降順にソートすることに成功しましたが、同じメソッドを使用して配列を昇順にソートすると、正常に処理されますが、レンジ "エラーです。私が言ったようにVisual Basicの選択「インデックスが範囲外です」の並べ替え

Sub sortDescending() 
    Dim array() As Integer = {3, 5, 200} 
    Dim maxPos As Integer 
    Dim firstI As Integer 
    While firstI <= UBound(array) 
     For i = firstI To UBound(array) 
      If array(i) > array(maxPos) Then 
       maxPos = i 
      End If 
     Next 
     Dim largestNumber As Integer = array(maxPos) 
     array(maxPos) = array(firstI) 
     array(firstI) = largestNumber 
     firstI = firstI + 1 
     maxPos = firstI 
     Console.WriteLine(largestNumber) 
    End While 
End Sub 

Sub sortAscending() 
    Dim array() As Integer = {3, 5, 200} 
    Dim minpos As Integer 
    Dim firstI As Integer 
    While firstI >= LBound(array) 
     For i = firstI To LBound(array) 
      If array(i) < array(minpos) Then 
       minpos = i 
      End If 
     Next 
     Dim smallestNumber As Integer = array(minpos) 
     array(minpos) = array(firstI) 
     array(firstI) = smallestNumber 
     firstI = firstI + 1 
     minpos = firstI 
     Console.WriteLine(smallestNumber) 
    End While 

、降順のソートが、しかし、問題なく動作します昇順1は私にエラーを与えている。以下は、私のコードです。誰でも私にこの問題を解決する方法を教えてもらえますか?ありがとう:)

+0

あなたはどのようなライン上で私たちに指示する必要がありますあなたはエラーが発生します。また、 'data = data.OrderByDescending(Function(x)x).ToArray()'だけが必要です。昇順のために 'OrderByDescending'を' OrderBy'に変更してください。 – Plutonix

+0

ああ、私は「Dim smallestNumber As Integer = array(minpos)」というエラーを受け取りました。残念ながら、このプログラムは割り当て用ですので選択ソートメソッドを使って行う必要があります:/ –

+0

'firstI> = LBound(array)'は常にTrueですので、ループを終了することはありません... 2以上になると、Indexは範囲外です。特定の理由で独自のソートルーチンを構築していない限りあなたはPlutonixが示唆しているように、組み込みの仕分け機能を使用する必要があります。 –

答えて

0

order byを組み込んで使用しないで選択ソートを適用するには、ソートアルゴリズムを正しく定義する必要があります。

ループが終了しないうちに実際に直面した問題は、常に真であると判断します。これをforループに変換し、最後にスワップを修正しました。

ここには、テストケースを使用する関数があります。

Private Sub SortArray(ByRef array() As Integer) 

Dim i As Integer 
Dim j As Integer 
Dim minimum As Integer 
Dim swapValue As Integer 
Dim upperBound As Integer 
Dim lowerBound As Integer 

lowerBound = LBound(array) 
upperBound = UBound(array) 

For i = lowerBound To upperBound 

     minimum = i 
     For j = i + 1 To upperBound 
      'Search for the smallest remaining item in the array 
      If array(j) < array(minimum) Then 
       'A smaller value has been found, remember the position in the array 
       minimum = j 
      End If 
     Next j 

     If minimum <> i Then 
      'Swap array Values 
      swapValue = array(minimum) 
      array(minimum) = array(i) 
      array(i) = swapValue 
     End If 

Next i 
End Sub 

この関数をmyArrayでコールします。

Dim numbers = New Integer() {3, 5, 200}  
SortArray(numbers) 

コードは何:

1.Findアレイ内の最小要素。

2.最初のposと最小のfound.soの要素を交換して、最小のelemnetが最初のposになります。 1つの以下の要素を持つリストを持つ2つのステップ上記

3.Repeat。(さらに処理から廃棄された最小の要素)

最終出力

enter image description here

関連する問題