将数组原始状态保存到另外一个副本中。排序完成后再到原始数组中检索下位置不就行了吗? 再或者就用结构体数组: private type xxx intVaule% intIndex% end typedim xxx(0 to 4)'初始化 v=split("3 7 6 8 1"," ") for i=0 to 4 xxx(i).intVaule=v(i) xxx(i).intIndex=i'记录原始位置 next'对数组xxx()进行排序。这样不论怎么排序它的原始索引总是跟着不同的。
补充完整: Private Type xxx intVaule As Integer intIndex As Integer End TypeDim x(4) As xxxPrivate Sub Form_Load() Dim v, i%, j%, intMax% Dim t As xxx
'初始化 v = Split("3 7 6 8 1", " ") For i = 0 To 4 x(i).intVaule = v(i) x(i).intIndex = i '记录原始位置 Next For i = 0 To 4 For j = i To 4 If x(j).intVaule > x(i).intVaule Then t = x(j) x(j) = x(i) x(i) = t End If Next Next
For i = 0 To 4 Debug.Print x(i).intVaule & vbTab & "原始索引:" & x(i).intIndex Next End Sub =================== 8 原始索引:3 7 原始索引:1 6 原始索引:2 3 原始索引:0 1 原始索引:4
使用跟踪数组。 Private Sub Form_Load() Dim a0, a1, i As Byte, n As Byte, m As Byte, m0 As Byte, m1 As Byte, s0 As String, s1 As String a0 = Array(3, 7, 6, 8, 1, 0, 9) ReDim a1(UBound(a0)) 'a1 = a0 也可' 跟踪数组 For i = 0 To UBound(a0) a1(i) = i Next For i = 0 To UBound(a0) For n = i To UBound(a0) If a0(n) > a0(i) Then m0 = a0(i) a0(i) = a0(n) a0(n) = m0 m1 = a1(i) '同时同步跟踪数组 a1(i) = a1(n) a1(n) = m1 End If Next Next For m = 0 To UBound(a1) s0 = s0 & a0(m) s1 = s1 & a1(m) Next Debug.Print s0 '排序后字符串 Debug.Print s1 '排序后原顺序号 End Sub
你自己玩数字排序,不也是需要记住原来的顺序么?原来的顺序,需要保存在某处。最简单的办法就是用自定义类型来代替原来的纯数组,增加一个“原始索引”成员。例如:private type MYTYPE theValue as long '元素的值 theIndex as long '元素的原始索引 end type这样的话,第一次初始化时就以当前的索引填充一下theIndex成员,以后要知道某个theValue是原来的哪个位置,只需要访问theIndex成员就行了,不需要再有一个查询的过程,大量数据时有效率优势,只不过内存占多了。看你自己如何取舍了。
再或者就用结构体数组:
private type xxx
intVaule%
intIndex%
end typedim xxx(0 to 4)'初始化
v=split("3 7 6 8 1"," ")
for i=0 to 4
xxx(i).intVaule=v(i)
xxx(i).intIndex=i'记录原始位置
next'对数组xxx()进行排序。这样不论怎么排序它的原始索引总是跟着不同的。
Private Type xxx
intVaule As Integer
intIndex As Integer
End TypeDim x(4) As xxxPrivate Sub Form_Load()
Dim v, i%, j%, intMax%
Dim t As xxx
'初始化
v = Split("3 7 6 8 1", " ")
For i = 0 To 4
x(i).intVaule = v(i)
x(i).intIndex = i '记录原始位置
Next For i = 0 To 4
For j = i To 4
If x(j).intVaule > x(i).intVaule Then
t = x(j)
x(j) = x(i)
x(i) = t
End If
Next
Next
For i = 0 To 4
Debug.Print x(i).intVaule & vbTab & "原始索引:" & x(i).intIndex
Next
End Sub
===================
8 原始索引:3
7 原始索引:1
6 原始索引:2
3 原始索引:0
1 原始索引:4
Private Sub Form_Load()
Dim a0, a1, i As Byte, n As Byte, m As Byte, m0 As Byte, m1 As Byte, s0 As String, s1 As String
a0 = Array(3, 7, 6, 8, 1, 0, 9)
ReDim a1(UBound(a0)) 'a1 = a0 也可' 跟踪数组
For i = 0 To UBound(a0)
a1(i) = i
Next
For i = 0 To UBound(a0)
For n = i To UBound(a0)
If a0(n) > a0(i) Then
m0 = a0(i)
a0(i) = a0(n)
a0(n) = m0
m1 = a1(i) '同时同步跟踪数组
a1(i) = a1(n)
a1(n) = m1
End If
Next
Next
For m = 0 To UBound(a1)
s0 = s0 & a0(m)
s1 = s1 & a1(m)
Next
Debug.Print s0 '排序后字符串
Debug.Print s1 '排序后原顺序号
End Sub
用这里的第一个排序方法,不会对原数组造成影响。
theValue as long '元素的值
theIndex as long '元素的原始索引
end type这样的话,第一次初始化时就以当前的索引填充一下theIndex成员,以后要知道某个theValue是原来的哪个位置,只需要访问theIndex成员就行了,不需要再有一个查询的过程,大量数据时有效率优势,只不过内存占多了。看你自己如何取舍了。