按从小到大的顺序排列的元素指数

时间:2017-04-12 11:49:03

标签: arrays vba excel-vba max min

我正在尝试为群组平衡问题制作一个初始解决方案,但我似乎陷入了一些听起来应该很简单的事情。

基本上我有一系列权重(随机整数),例如

W() = [1, 4, 3, 2, 5, 3, 2, 1]

我想创建另一个长度相同的数组,数字1到数组的大小,分别代替最小到最大的数字,例如。

S() = [1, 7, 5, 3, 8, 6, 4, 2]

对于重复项,第一次出现的是较小的索引。

我最初使用的是BubbleSort算法,但不幸的是,这不允许我以所需的格式提供输出。

我知道这是一个非常具体的问题,但我们将非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

尝试一下,让我知道它对你有用:

Option Base 0
Option Explicit
Option Compare Text

Sub tmpSO()

Dim tmp As Double
Dim strJoin As String
Dim i As Long, j As Long
Dim W As Variant, S() As Double, X() As Long

'Load W
W = Array(1, 4, 3, 2, 5, 3, 2, 1)

'Set the dimensions for the other arrays
ReDim S(LBound(W) To UBound(W))
ReDim X(LBound(W) To UBound(W))

'Copy W into S
For i = LBound(W) To UBound(W)
    S(i) = W(i)
Next i

'Sort S
For i = LBound(S) To UBound(S) - 1
    For j = i + 1 To UBound(S)
        If S(i) > S(j) Then
            tmp = S(j)
            S(j) = S(i)
            S(i) = tmp
        End If
    Next j
Next i

'Get the results into X
For i = LBound(S) To UBound(S)
    X(i) = WorksheetFunction.Match(W(i), S, 0)
    S(WorksheetFunction.Match(W(i), S, 0) - 1) = vbEmpty
Next i

'Print out W (original array)
Debug.Print Join(W, ",")

'Print out x (result array)
For i = LBound(X) To UBound(X)
    strJoin = strJoin & "," & X(i)
Next i
Debug.Print mid(strJoin, 2)

End Sub

答案 1 :(得分:1)

您必须找到一种方法将值(内容)和索引粘合在一起。 正如您标记了excel-vba,我建议您将数据写入工作表,第一列为值,第二列为索引,并使用range.sort对其进行排序。之后,第二列保存您的订单

如果使用Excel不是一个选项,我可以考虑的最好的选择是创建一个Scripting.Dictionary(索引作为键)并对其进行排序(没有构建函数来对其进行排序,但谷歌搜索它你可以找一些例子。

或者你可以做一些丑陋的事情,比如从你的数据创建一个双打数组,小数部分保存索引 [1.001, 4.002, 3.003, 2.004, 5.005, 3.006, 2.007, 1.008],对此进行排序,得到小数,然后将它们乘以整数。

答案 2 :(得分:0)

非常感谢所有给予帮助的人!

我接受了你的建议,并设法建立了自己的解决方案,尽管他花了一整天时间处理与我的整体项目关系不大的事情。

以下是我使用的代码:

Sub InitialSol(S() As Integer, n As Integer, k As Integer, W() As Long)
Dim i As Integer, c As Integer
Dim min As Long, max As Long, temp As Long

min = W(1)
max = W(1)
For i = 2 To n
    If W(i) <= min Then
        min = W(i)
    End If
    If W(i) >= max Then
        max = W(i)
    End If
Next i

c = 1
Do While c <= n
    temp = max
    For i = 1 To n
        If W(i) = min Then
            S(i) = c
            c = c + 1
        End If
    Next i
    For i = 1 To n
        If W(i) > min And W(i) <= temp Then
            temp = W(i)
        End If
    Next i
    min = temp
Loop

End Sub