如何按字典顺序排列数组 vb.net [英] How to order array in lexicographical order vb.net
本文介绍了如何按字典顺序排列数组 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屋!
查看全文