当前位置: 首页 > 知识库问答 >
问题:

如何实现链表快速排序?(大部分代码已完成)

欧阳山
2023-03-14

我在visual basic中实现链表快速排序时遇到了一些困难,问题是典型的堆栈溢出。由于它是一个递归算法,我认为它是我所缺少的相当简单的东西,但我已经盯着它看了好几个小时,在纸上跟踪它-它将永远只工作在三个或更少的项目,有时四个。任何帮助都将不胜感激。

我所遵循的算法是

  1. 从列表中选择一个称为透视的元素。
  2. 对列表重新排序,使所有值小于透视的元素都在透视之前,而所有值大于透视的元素都在透视之后(相等的值可以从任何一个方向移动)。分区后,枢轴处于其最终位置。这称为分区操作。
  3. 将上述步骤递归应用于具有较小值的元素子列表,并单独应用于具有较大值的元素子列表。

变量“countabc”保存列表中的项目数。

下面是node类的代码:

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

当lower和higher被声明为“new allColumns”时,它们不是有自己的countABC值吗?

我不认为例程是导航到pivot然后排序它后面的所有值,例程的这一部分才是实际排序,“ptr”被设置为“start.nextnode”IE。事前列表中的第一项。

 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))

我应该先说得更清楚一点,道歉。

共有1个答案

蒋星驰
2023-03-14
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
        ...
        Return (Joinlists(lower.SortAlphabetically, pivot, 
                                         higher.SortAlphabetically))

countabc似乎是全局节点计数,而不是当前排序的子节的节点计数,因此该条件总是为真,因此将有无限次递归。

还有,start到底是从哪里来的(它是从哪里更新的)?

最后,在我看来,您是导航到pivot节点,然后根据比较添加到左侧和右侧子列表,但是pivot之前的节点呢?

 类似资料:
  • 本文向大家介绍比较排序之快速排序(实例代码),包括了比较排序之快速排序(实例代码)的使用技巧和注意事项,需要的朋友参考一下 快速排序(简称快排)因为其效率较高(平均O(nlogn))经常在笔试题中对其考查。 对于快排的第一步是选取一个“基数”,将会用这个“基数”与其它数进行比较交换。而这个“基数”的选择将影响到快排的效率如何,但如果为了选择基数而选择基数则会本末倒置。例如为了找到最佳基数,则需要在

  • 本文向大家介绍Scala实现冒泡排序、归并排序和快速排序的示例代码,包括了Scala实现冒泡排序、归并排序和快速排序的示例代码的使用技巧和注意事项,需要的朋友参考一下 1、冒泡排序 2、归并排序 3、快速排序 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍java冒泡排序和快速排序代码,包括了java冒泡排序和快速排序代码的使用技巧和注意事项,需要的朋友参考一下 冒泡排序: 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 快速排序: 算法:当数据量很大适宜采用该方法。采用二分

  • 本文向大家介绍php 二维数组快速排序算法的实现代码,包括了php 二维数组快速排序算法的实现代码的使用技巧和注意事项,需要的朋友参考一下 php 二维数组快速排序算法的实现代码 二维数组排序算法与一维数组排序算法基本理论都是一样,都是通过比较把小的值放在左变的数组里,大的值放在右边的数组里在分别递归。 实例代码: 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的

  • js中如何实现快速排序?guolguul都不会放

  • 我写了一个合并两个已经排序的链表的方法。然而,由于某种原因,列表的最后一个节点没有打印出来。有什么想法吗? 下面是链接列表的合并排序方法。