Выбор сортировки - переполнение стека - PullRequest
0 голосов
/ 20 октября 2010

Привет. Я пытаюсь реализовать сортировку выборки в vb.net с помощью рекурсии.Проблема в том, что я получаю stackoverflow, если массив, который я хочу отсортировать, состоит из 1000 элементов.Я не могу найти проблему.Я не знаю много о переполнении стека или как это проверить.По моим исследованиям, проблема может быть в бесконечной рекурсии, но я проверяю это и выхожу из подпрограммы. Вот основной код:

Public Class SelectionSort
Inherits DefaultSort


Public Sub New(ByVal num As Integer)
    Me.CreateArray(num)
    Me.ShowArray()
    Me.StartWatch()
    Me.Sort(Arr.Length - 1, 0, 1)
    Me.StopWatch()
    Me.ShowArray()
    Me.ShowExecutionTime()
End Sub





Private IsSorted As Boolean = False
Public Overridable Sub Sort(ByVal arrLen As Integer, ByVal pos As Integer, ByVal minval As Integer)



    If pos >= arrLen Then
        IsSorted = True
    End If

    If IsSorted = True Then
        Exit Sub
    End If



    Dim minKey As Integer = Array.IndexOf(Arr, minval + pos)
    Dim temp As Integer = Arr(minKey)


    Arr(minKey) = Arr(pos)
    Arr(pos) = temp
    pos += 1

    Sort(arrLen, pos, minval)
    If pos >= arrLen Then
        IsSorted = True
    End If

    If IsSorted = True Then
        Exit Sub
    End If

End Sub

Конечный класс

Все внутри конструктора установленоБазовый класс "DefaultSort", за исключением Sort ().Массив устанавливается с помощью свойств:

Public Overridable Property Arr() As Integer()

    Get
        Return _array
    End Get

    Set(ByVal value() As Integer)
        _array = value
    End Set

End Property
Private _array() As Integer

Насколько я знаю, все должно работать.Он работает на массиве из 10 элементов и массиве из 100 элементов.

Любые идеи, застрял !!!:)

1 Ответ

2 голосов
/ 20 октября 2010

Не используйте рекурсию для этого.Вместо этого используйте итеративное решение

Обновление: Если вы посмотрите на документ для StackOverflowExectpion , оно говорит

Исключение, которое выдается, когдастек выполнения переполняется, потому что он содержит слишком много вложенных вызовов методов.

При написании этого вида каждый элемент посещается с помощью рекурсивного вызова метода.например, первый элемент вызывает sort для второго элемента, который вызывает sort для третьего элемента и так далее.Это означает, что глубина рекурсии равна количеству членов (я могу быть отключен на +/- 1).

Это означает, что если у вас будет достаточно элементов, вы получите StackOverflow.

Я скопировал ваш код и запустил его, а ниже приведен усеченный стек вызовов, который показывает, что сортировка вызывается для каждой позиции рекурсивно и что она умирает при наличии более 8,314 элементов.

MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8314, Integer minval = 1) Line 67 + 0xb bytes  Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8314, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8313, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8312, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8311, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8310, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8309, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8308, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8307, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8306, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8305, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8304, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8303, Integer minval = 1) Line 75 + 0x14 bytes Basic
MyApp.exe!MyApp.SelectionSort.Sort(Integer arrLen = 10000, Integer pos = 8302, Integer minval = 1) Line 75 + 0x14 bytes Basic
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...