このマージソートがスタックオーバーフローを引き起こす理由を理解できません。それは基本的なケースがないからです。それがあれば、どうすれば追加することができますか? また、配列を再帰的に分割すると、データがどこに格納されているかを理解できないという問題があります。元の配列を分割すると分割されることが分かりますダウン個々の要素に、しかしどここれらの個々の要素は、このコードで問題のマージソートでスタックオーバーフローが発生する
Sub Main()
Dim Array() As Integer = {5, 4, 3, 1, 2, 6}
Dim right As Integer = Array.Length - 1 'find right index
Dim left As Integer = 0 'set left index
mergeSort(Array, left, right)
End Sub
Sub mergeSort(Array, left, right)
Dim middle As Integer
If left < right Then
middle = (left + right)/2
'recursively split both halves of the array
mergeSort(Array, left, middle)
mergeSort(Array, middle + 1, right)
'sort individual elements
mergeSortedArray(Array, left, middle, middle + 1, right)
End If
End Sub
Sub mergeSortedArray(ByRef Array, left, middle, rbeg, right)
Dim pt As Integer = 0
Dim TempArray(6)
While (left <= middle) And (rbeg <= right) 'sort every element
If Array(left) < Array(rbeg) Then
TempArray(pt) = Array(left)
left += 1
Else
TempArray(pt) = Array(rbeg)
rbeg += 1
End If
pt += 1
End While
If left > middle Then
While rbeg <= right 'left sub array exhausted
TempArray(pt) = Array(rbeg)
rbeg += 1
pt += 1
End While
Else
While left <= middle 'right sub array exhausted
TempArray(pt) = Array(left)
left += 1
pt += 1
End While
End If
For Each element In TempArray
Console.WriteLine(element & " ")
Next
End Sub
ほとんどの場合。 'mergeSort(Array、left、right)'を持つ再帰関数は、おそらく 'mergeSort(Ar左、中央) 'またはそれに似たもの:)(Sub MergeSortの内部では、全く同じパラメータで関数を呼び出しています) – Icepickle
脆弱性を発見するためのAhh 1アップ。コードを修正しますが、それでもまだオーバーフローが発生します。 – Rich
真となります。なぜなら、場合によっては左と中も同じで、中が右でなく、中+ 1が残っていないと呼び出すだけなのでです。私は投稿を削除しました。あなたのコードには他にも多くの欠陥がありますから、もう少し長く作業する必要があると思います) – Icepickle