如何按字典顺序排列数组 vb.net [英] How to order array in lexicographical order vb.net

查看:53
本文介绍了如何按字典顺序排列数组 vb.net的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这对我来说有点复杂

    Dim test() As Byte = New Byte() {50, 40, 30, 10, 10}
    Dim answer() As UInteger = SortLexicoGraphicallyBigIntegerArray(test)

答案是每个 Rotation 从最低数组值到最高数组值排序.

The answer is the each Rotation sorted from lowest array value to highest array value.

Rotation 0 = 50, 40, 30, 10, 10
Rotation 1 = 10, 50, 40, 30, 10
Rotation 2 = 10, 10, 50, 40, 30
Rotation 3 = 30, 10, 10, 50, 40
Rotation 4 = 40, 30, 10, 10, 50

当我手动对上面的数组进行排序时,我应该得到

When I sort this array above by hand I should get

Rotation 2 = 10, 10, 50, 40, 30
Rotation 1 = 10, 50, 40, 30, 10
Rotation 3 = 30, 10, 10, 50, 40
Rotation 4 = 40, 30, 10, 10, 50
Rotation 0 = 50, 40, 30, 10, 10

所以答案应该是 2, 1, 3, 4, 0

我陷入了一个无限循环,我无法将手指放在上面

I get stuck in a infinite loop and I can't put my finger on it

这是我的代码

Public Function GetRotation(Data As Byte(), rotation As UInteger) As Byte()
   'Rotation Left
    Dim rotationData As New List(Of Byte)

    Dim start As UInteger = Data.Length - rotation Mod Data.Length

    For i = 0 To Data.Length - 1
        rotationData.Add(Data((start + i) Mod (Data.Length)))
    Next

    Return rotationData.ToArray()
End Function

Public Function SortLexicoGraphicallyBigIntegerArray(data As Byte()) As UInteger()
    Dim OrderedRotations As New List(Of UInteger)
    Dim index As Integer = 0
    Dim rowSwapped As Boolean
    Dim data1 As Byte()
    Dim data2 As Byte()

    For rotation As Short = 0 To data.Length - 1
        OrderedRotations.Add(rotation)
    Next

    For rotation As Long = data.Length - 1 To 0 Step -1
        Do
            rowSwapped = False
            data1 = GetRotation(data, OrderedRotations(rotation))
            data2 = GetRotation(data, OrderedRotations((rotation + 1) Mod (data.Length)))
            Do
                If data1(index) > data2(index) Then
                    'Swaps a full row in a few copies.
                    Dim tmpFirst As UInteger = OrderedRotations(index)
                    OrderedRotations(index) = OrderedRotations(index + 1)
                    OrderedRotations(index + 1) = tmpFirst

                    data1 = GetRotation(data, OrderedRotations(rotation))
                    data2 = GetRotation(data, OrderedRotations((rotation + 1) Mod (data.Length)))
                    rowSwapped = True
                End If
                index += 1
            Loop While index < data.Length - 1
            index = 0

        Loop While rowSwapped <> False
    Next
    Return OrderedRotations.ToArray()
End Function

这是我尝试过的新尝试,但仍然无法成功

Here is a new attempt I tried I still can't make it work

    Public Function SortLexicoGraphicallyBigIntegerArray(ByRef data As Byte()) As UInteger()
        Dim OrderedRotations As New List(Of UInteger)
        Dim index As Integer = 0
        Dim data1 As Byte()
        Dim data2 As Byte()

        Dim rotation As UInteger = 0
        Dim eachRotation As Integer = 0
        Dim TryAgain As Boolean = False

        For rotation = 0 To data.Length - 1
            data1 = GetRotation(data, rotation)
            OrderedRotations.Add(rotation)
            If OrderedRotations.Count > 1 Then
redo:
                data1 = GetRotation(data, OrderedRotations(rotation))
                For eachRotation = OrderedRotations.Count - 1 To 0 Step -1
                    If OrderedRotations(eachRotation) = OrderedRotations(rotation) Then Continue For
                    data2 = GetRotation(data, OrderedRotations(eachRotation))

                    For index = 0 To data.Length - 1
                        If data1(index) = data2(index) Then
                            Continue For
                        ElseIf data1(index) < data2(index) Then
                            Exit For
                        ElseIf data1(index) > data2(index) Then
                            Dim tmpFirst As UInteger = OrderedRotations(rotation)
                            OrderedRotations(rotation) = OrderedRotations(eachRotation)
                            OrderedRotations(eachRotation) = tmpFirst
                            GoTo redo
                            Exit For
                        End If
                    Next
                Next
            End If
        Next

        Return OrderedRotations.ToArray()
    End Function

与我无法掌握的多层比较有关.

Something to do with multi-layer comparisons which I can't grasp.

推荐答案

可以做一个通用的二元排序算法:-

You can do a general binary sort algorithm:-

Dim flag As Boolean
Dim tempvalue As dataarraytype
Dim i As Integer

Do
    flag = False
    For i = 0 to dataarray.length - 2
        If dataarray(i) > dataarray(i+1) Then   'Do the test you require
            'Swap values
            tempvalue = dataarray(i)
            dataarray(i) = dataarray(i+1)
            dataarray(i+1) = tempvalue
            flag = True
        End If
    Next
Loop While flag

使用 FateOfLeap 的答案解决这里是完整的工作代码

Solved using FateOfLeap's answer here is the full working code

Public Function SortLexicoGraphicallyBigIntegerArray(ByRef data As Byte()) As UInteger()
    Dim OrderedRotations As New List(Of UInteger)
    Dim index As Integer = 0
    Dim data1 As Byte()
    Dim data2 As Byte()

    Dim rotation As UInteger = 0
    Dim eachRotation As Integer = 0
    Dim TryAgain As Boolean = False

    For rotation = 0 To data.Length - 1
        data1 = GetRotation(data, rotation)
        OrderedRotations.Add(rotation)
        If OrderedRotations.Count > 1 Then
            Dim flag As Boolean
            Do
                flag = False

                For eachRotation = OrderedRotations.Count - 1 To 0 Step -1
                    data1 = GetRotation(data, OrderedRotations(rotation))
                    If OrderedRotations(eachRotation) = OrderedRotations(rotation) Then Continue For
                    data2 = GetRotation(data, OrderedRotations(eachRotation))

                    For index = 0 To data.Length - 1
                        If data1(index) > data2(index) Then
                            Exit For
                        ElseIf data1(index) < data2(index) Then
                            Dim tmpFirst As UInteger = OrderedRotations(rotation)
                            OrderedRotations(rotation) = OrderedRotations(eachRotation)
                            OrderedRotations(eachRotation) = tmpFirst
                            flag = True
                        End If
                    Next
                Next
            Loop While flag
        End If
    Next

    Return OrderedRotations.ToArray()
End Function

这篇关于如何按字典顺序排列数组 vb.net的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆