У меня возникли трудности с реализацией связанного списка quicksort в visual basic, и проблема в том, что это классический переполнение стека. Поскольку это рекурсивный алгоритм, я предполагаю, что это что-то довольно простое, которого я пропускаю, но я смотрел на это часами, прослеживая его на бумаге - он будет работать только с тремя элементами или меньше, а иногда и с четырьмя. Любая помощь приветствуется.Как реализовать связанный список quicksort? (большая часть кода завершена)
Алгоритм Я Ниже
- Выберите элемент, который называется стержнем, из списка.
- Переупорядочить список, чтобы все элементы со значениями, меньшими, чем точка поворота, приходили перед точкой поворота, а все элементы со значениями, превышающими точку поворота, приходили после него (равные значения могут идти в любом случае). После этого разбиения стержень находится в своем последнем положении. Это называется операцией раздела.
- Рекурсивно применяйте вышеуказанные шаги к под-списку элементов с меньшими значениями и отдельно под-список элементов с большими значениями.
Переменная "countABC" содержит количество элементов в списке.
Вот код класса узла:
Public Class Node
'Each node contains the values for one value and is stored
'in the dynamic linked list.
Public Name As String
Public NextNode As Node
Public PKey As Integer
Public Sub New()
'Initializes a new node
Name = ""
NextNode = Nothing
PKey = 0
End Sub
End Class
Public start As Node
Public Sub New()
'Initializes a new linked list by setting start as the first node
start = New Node
End Sub
Для добавления подпрограммы:
Public Sub AddABC(ByVal Name As String, ByVal PKey As Integer)
'Adds items to a dynamic linked list ordered in alphabetical order
Dim NewNode As New Node
Dim ptr As Node = start.NextNode
Dim prev As Node = start
NewNode.PKey = PKey
While ptr IsNot Nothing AndAlso ptr.Name < NewNode.Name
prev = ptr
ptr = ptr.NextNode
End While
NewNode.Name = Name
NewNode.NextNode = ptr
prev.NextNode = NewNode
countABC += 1
End Sub
И эти две функции, необходимые для сортировки (в списках присоединиться для конкатенации)
Public Function SortAlphabetically() As AllColumns
'This is a quicksort routine that creates a new linked list
'(that is not saved) in alphabetical order
If countABC > 1 Then
Dim pivotPkey As Integer = Math.Ceiling(countABC/2)
Dim pivot As New Node
Dim ptr As Node = start.NextNode
While ptr IsNot Nothing
If ptr.PKey = pivotPkey Then
pivot = ptr
End If
ptr = ptr.NextNode
End While
Dim lower As New AllColumns
Dim higher As New AllColumns
ptr = start.NextNode
While ptr IsNot Nothing
If ptr.Name < pivot.Name Then
lower.AddABC(ptr.Name, ptr.PKey)
Else
higher.AddABC(ptr.Name, ptr.PKey)
End If
ptr = ptr.NextNode
End While
Return (Joinlists(lower.SortAlphabetically, pivot,
higher.SortAlphabetically))
Else
Return Me
End If
End Function
Private Function Joinlists(ByVal lower As AllColumns,
ByVal pivot As Node,
ByVal higher As AllColumns) As AllColumns
'Joins two dynamic linked lists together with a pivot value
'separating them
Dim list As AllColumns = lower
list.AddABC(pivot.Name, pivot.PKey)
Dim ptr As Node = higher.start.NextNode
While ptr IsNot Nothing
list.AddABC(ptr.Name, ptr.PKey)
ptr = ptr.NextNode
End While
Return list
End Function
Спасибо за чтение, надеюсь, я достаточно хорошо объяснил проблему и ничего не пропустил (что возможно, потому что это часть более крупной программы).
Редактировать
Вот полное определение класса и первого суб, который, надеемся объяснить это лучше:
Public Class AllColumns
Public countABC As Integer = 0
Public Class Node
'Each node contains the values for one value and is stored in the dynamic linked list.
Public Name As String
Public NextNode As Node
Public PKey As Integer
Public Sub New()
'Initialises a new node
Name = ""
NextNode = Nothing
PKey = 0
End Sub
End Class
Public start As Node
Public Sub New()
'Initialises a new linked list by setting start as the first node
start = New Node
countABC = 0
End Sub
Это не тот случай, когда ниже и выше объявляются как " Новые Allcolumns "у них будут свои собственные значения для countABC, которые увеличиваются, когда узлы помещаются в список?
Я не думаю, что процедура навигации к оси, а затем сортировать все значения после этого, эта часть подпрограммы является фактическая сортировка, и «PTR» установлен в положение «start.nextnode», то есть. первый элемент в списке заранее.
ptr = start.NextNode
While ptr IsNot Nothing
If ptr.Name < pivot.Name Then
lower.AddABC(ptr.Name, ptr.PKey)
Else
higher.AddABC(ptr.Name, ptr.PKey)
End If
ptr = ptr.NextNode
End While
Return (Joinlists(lower.SortAlphabetically, pivot,
higher.SortAlphabetically))
Я должен был сделать это более понятным для начала, извинения.
Спасибо за помощь, но я все еще ничего не видел, чтобы изменить (очевидно, что я просто не могу понять это!) Если бы вы могли взглянуть на дополнительную информацию, которую я поставил на вопрос I Будем очень благодарны. – Initioterum