2017-10-18 16 views
0

クイックソートをしようとしていますが、VB.netのスタックオーバーフロー例外に問題があります。クイックソートのスタックオーバーフロー例外

ときのx = 3ソートが断続的にX = 5とそのA以来ときのx = 10

教えてください、ありがとう

Dim x As Integer = 10 
    Dim numArrray(x - 1) As Integer 

    For i = 0 To x - 1 
     Randomize() 
     numArrray(i) = CInt(Rnd() * 9) 
    Next 

    Quicksort(numArrray, 0, numArrray.Length - 1) 

    For i = 0 To x - 1 
     Console.Write(numArrray(i)) 
    Next 
    Console.ReadLine() 
End Sub 

Sub Quicksort(ByVal array() As Integer, ByVal min As Integer, ByVal max As Integer) 
    Dim pivot As Integer 

    If min < max Then 
     pivot = partition(array, min, max) 
     Quicksort(array, min, pivot - 1) 
     Quicksort(array, pivot + 1, max) 
    End If 
End Sub 

Function partition(ByVal array() As Integer, ByVal min As Integer, ByVal max As Integer) As Integer 
    Dim pivot As Integer = array(max) 
    Dim count As Integer = min - 1 
    Dim placeholder As Integer 

    For i = min To max - 1 
     If array(i) < pivot Then 
      count += 1 
      placeholder = array(count) 
      array(count) = array(i) 
      array(i) = placeholder 
     End If 
    Next 
    If array(max) < array(count + 1) Then 
     placeholder = array(count + 1) 
     array(count + 1) = array(max) 
     array(max) = placeholder 
    End If 
    Return count 

End Function 
+0

これはコンパイルされません、デバッグしてから踏み込んだ? – Codexer

+1

スタックオーバーフローのため、クイックソートへのネストされた呼び出しで、パーティションを見ています。このバージョンのアルゴリズムに従って、境界エラーがあると思います。https://en.wikipedia.org/wiki/Quicksortあなたのネストされた呼び出しが同じ入力を持つように、無限回帰になります(つまり、count = min -1を返した場合、再帰呼び出しを行います)。クイックソート(配列、ピボット+ 1、最大)==クイックソート(配列、分、最大) – tolanj

+0

@tolanjそれはあなたに感謝しました! – Chloe

答えて

2

ある時にリストの半分をソートし、正常に動作しますスタックオーバーフローはクイックソートへのネストされた呼び出しにあり、パーティションを見ています。このバージョンのアルゴリズムでは境界エラーがあると思いますen.wikipedia.org/wiki/Quicksortパーティションからcount + 1を返す必要がありますあなたのネストされた呼び出しが同じ入力を持つように、現在の実装数は最小値より下で開始し、そのままになります。これは無限回帰です(つまり、y Quicksort(配列、ピボット+ 1、最大)==クイックソート(配列、最小、最大)

関連する問題