二维数组大小排序求教高手,谢谢!!!有一个数组:
如:aa(3,3)数据为:0 10 5 6
1 8 9 3
2 12 10 9 我想实现第二(三)列按照大小排序,请教高手该如何做,谢谢0 12 10 9
1 10 5 6
2 8 9 30 12 10 9
1 8 9 3
2 10 5 6
如:aa(3,3)数据为:0 10 5 6
1 8 9 3
2 12 10 9 我想实现第二(三)列按照大小排序,请教高手该如何做,谢谢0 12 10 9
1 10 5 6
2 8 9 30 12 10 9
1 8 9 3
2 10 5 6
Dim i, iis, s As Integer
Dim tempsj() As String
Dim AA, AB As Date
ReDim tempsj(UBound(dqsj) - ds + 1, 13)
For i = 0 To UBound(dqsj) - ds
For iis = i + 1 To UBound(dqsj) - ds
If dqsj(i, xh) > dqsj(iis, xh) Then
For s = 0 To 13
tempsj(i, s) = dqsj(i, s)
Next
Else
For s = 0 To 13
tempsj(i, s) = dqsj(iis, s)
Next
End If
Next
Next
Dim i, iis, s As Integer
Dim tempsj() As String
Dim AA, AB As Date
ReDim tempsj(13)
For i = 0 To UBound(dqsj)-ds
For iis = i + 1 To UBound(dqsj) - ds
If dqsj(i,xh) < dqsj(iis,xh) Then
For s = 0 To 13 - 1
tempsj(s) = dqsj(i, s)
dqsj(i,s)=dqsj(iis,s)
dqsj(iis,s)=tempsj(s)
Next
End If
Next
Next
就是这个意思,还请帮助,谢谢!!!
'这里Arr的类型(integer、long等)按你的实际情况来定义,但是确保是二维数组。
'我是以数组下标从 1 开始来处理的,请在本模块的最前面加上:
' Option Base 1
'参数中的 KeyCol 是指以数组的第 KeyCol 列为关键字(也是从 1 开始) Dim plColNum&, plRowNum&, plSort&
Dim i&, j&, k&, M&
Dim lIndex&(), lTempData&()
Dim lSortData&() '这个数组的类型要与参数中的相同或“兼容”
plColNum = UBound(Arr, 2)
plRowNum = UBound(Arr, 1)
ReDim lIndex(plRowNum), lTempData(plRowNum)
ReDim lSortData(plRowNum, plColNum)
For i = 1 To plRowNum
lTempData(i) = Arr(i, KeyCol)
Next
lIndex(1) = 1
plSort = 1
For i = 2 To plRowNum
M = lTempData(i)
For j = 1 To plSort
If (M > lTempData(lIndex(j))) Then Exit For
Next
plSort = plSort + 1
For k = plSort To j + 1 Step -1
lIndex(k) = lIndex(k - 1)
Next
lIndex(j) = i
Next
For i = 1 To plRowNum
j = lIndex(i)
For k = 1 To plColNum
lSortData(i, k) = Arr(j, k)
Next
Next
For i = 1 To plRowNum
For k = 1 To plColNum
Arr(i, k) = lSortData(i, k)
Next
NextEnd Sub 这是针对数字类型的二维数组,以单关键字降序排序的代码。
你理解了原理后,适当修改就能完成多关键字、混合数据类型表的排序了。
原数组:
10 5 13 24
3 55 43 2
30 51 113 21
按第1列排序结果
3 55 43 2
10 5 13 24
30 51 113 21
按第2列排序结果
10 5 13 24
30 51 113 21
3 55 43 2
按第3列排序结果
10 5 13 24
3 55 43 2
30 51 113 21
按第4列排序结果
3 55 43 2
30 51 113 21
10 5 13 24
Dim AA() As Integer
Private Sub Command1_Click()
ReDim AA(3, 4)
AA(0, 0) = 10
AA(0, 1) = 5
AA(0, 2) = 13
AA(0, 3) = 24AA(1, 0) = 3
AA(1, 1) = 55
AA(2, 2) = 43
AA(1, 3) = 2AA(2, 0) = 30
AA(2, 1) = 51
AA(2, 2) = 113
AA(2, 3) = 21
Call Sort(AA(), 1)
For i = 0 To 2
Me.Print AA(i, 0) & " " & AA(i, 1) & " " & AA(i, 2) & " " & AA(i, 3)
Next
End Sub
Sub Sort(Arr() As Integer, KeyCol%)
'这里Arr的类型(integer、long等)按你的实际情况来定义,但是确保是二维数组。
'我是以数组下标从 1 开始来处理的,请在本模块的最前面加上:
' Option Base 1
'参数中的 KeyCol 是指以数组的第 KeyCol 列为关键字(也是从 1 开始) Dim plColNum&, plRowNum&, plSort&
Dim i&, j&, k&, M&
Dim lIndex&(), lTempData&()
Dim lSortData&() '这个数组的类型要与参数中的相同或“兼容”
plColNum = UBound(Arr, 2)
plRowNum = UBound(Arr, 1)
ReDim lIndex(plRowNum), lTempData(plRowNum)
ReDim lSortData(plRowNum, plColNum)
For i = 1 To plRowNum
lTempData(i) = Arr(i, KeyCol)
Next
lIndex(1) = 1
plSort = 1
For i = 2 To plRowNum
M = lTempData(i)
For j = 1 To plSort
If (M > lTempData(lIndex(j))) Then Exit For
Next
plSort = plSort + 1
For k = plSort To j + 1 Step -1
lIndex(k) = lIndex(k - 1)
Next
lIndex(j) = i
Next
For i = 1 To plRowNum
j = lIndex(i)
For k = 1 To plColNum
lSortData(i, k) = Arr(j, k)
Next
Next
For i = 1 To plRowNum
For k = 1 To plColNum
Arr(i, k) = lSortData(i, k)
Next
NextEnd Sub
我把你多余的部分改成注释,
并且列是由0开始计数,建议用0开始计数的数组。'Dim AA() As Integer
Private Sub Command1_Click()
ReDim AA(3, 4)
AA(0, 0) = 10
AA(0, 1) = 5
AA(0, 2) = 13
AA(0, 3) = 24AA(1, 0) = 3
AA(1, 1) = 55
AA(1, 2) = 43
AA(1, 3) = 2AA(2, 0) = 30
AA(2, 1) = 51
AA(2, 2) = 113
AA(2, 3) = 21
Call Sort(AA(), 0)
For i = 0 To 2
Me.Print AA(i, 0) & " " & AA(i, 1) & " " & AA(i, 2) & " " & AA(i, 3)
Next
End Sub
Sub Sort(Arr() As Integer, ByVal KeyCol%)
'这里Arr的类型(integer、long等)按你的实际情况来定义,但是确保是二维数组。
'我是以数组下标从 1 开始来处理的,请在本模块的最前面加上:
' Option Base 1
'参数中的 KeyCol 是指以数组的第 KeyCol 列为关键字(也是从 1 开始) Dim plColNum&, plRowNum&, plSort&
Dim i&, j&, k&, M&
Dim lTempData&()
' Dim lSortData&() '这个数组的类型要与参数中的相同或“兼容”
' Dim lIndex&(),
plColNum = UBound(Arr, 2) - 1
plRowNum = UBound(Arr, 1) - 1
ReDim lIndex(plRowNum), lTempData(plRowNum)
ReDim lSortData(plRowNum, plColNum)
For i = 0 To plRowNum
lTempData(i) = Arr(i, KeyCol)
Next
For i = 0 To plRowNum
For j = i + 1 To plRowNum
If lTempData(i) > lTempData(j) Then
k = lTempData(j)
lTempData(j) = lTempData(i)
lTempData(i) = lTempData(j)
For M = 0 To plColNum
k = Arr(j, M)
Arr(j, M) = Arr(i, M)
Arr(i, M) = k
Next
End If
Next
Next
''''''''''''''''''''''''''''''''''''''''''''''''''''''
'lIndex(1) = 1
'plSort = 1
' For i = 2 To plRowNum
' M = lTempData(i)
' For j = 1 To plSort
' If (M > lTempData(lIndex(j))) Then Exit For
' Next
' plSort = plSort + 1
' For k = plSort To j + 1 Step -1
' lIndex(k) = lIndex(k - 1)
' Next
' lIndex(j) = i
' Next
' For i = 1 To plRowNum
' j = lIndex(i)
' For k = 1 To plColNum
' lSortData(i, k) = Arr(j, k)
' Next
' Next
' For i = 1 To plRowNum
' For k = 1 To plColNum
' Arr(i, k) = lSortData(i, k)
' Next
' NextEnd Sub
问题在代码中注明.
Dim AA() As Integer
Private Sub Command1_Click()
'ReDim AA(3, 4)
ReDim AA(2, 3) '这里有问题,上面定义的是3,4,而下面的下标却是0,开时
AA(0, 0) = 10
AA(0, 1) = 5
AA(0, 2) = 13
AA(0, 3) = 24AA(1, 0) = 3
AA(1, 1) = 55
AA(1, 2) = 43
AA(1, 3) = 2AA(2, 0) = 30
AA(2, 1) = 51
AA(2, 2) = 113
AA(2, 3) = 21
Call Sort(AA(), 2)
For i = 0 To 2
Me.Print AA(i, 0) & " " & AA(i, 1) & " " & AA(i, 2) & " " & AA(i, 3)
Next
End Sub
Sub Sort(Arr() As Integer, ByVal KeyCol%)
'这里Arr的类型(integer、long等)按你的实际情况来定义,但是确保是二维数组。
'我是以数组下标从 1 开始来处理的,请在本模块的最前面加上:
' Option Base 1
'参数中的 KeyCol 是指以数组的第 KeyCol 列为关键字(也是从 1 开始) Dim plColNum&, plRowNum&, plSort&
Dim i&, j&, k&, M&
Dim lTempData&()
' Dim lSortData&() '这个数组的类型要与参数中的相同或“兼容”
' Dim lIndex&(),
plColNum = UBound(Arr, 2)
plRowNum = UBound(Arr, 1) '与上一贴这里做了改正
ReDim lIndex(plRowNum), lTempData(plRowNum)
ReDim lSortData(plRowNum, plColNum)
For i = 0 To plRowNum
lTempData(i) = Arr(i, KeyCol)
Next
For i = 0 To plRowNum
For j = i + 1 To plRowNum
If lTempData(i) > lTempData(j) Then
k = lTempData(j)
lTempData(j) = lTempData(i)
lTempData(i) = lTempData(j)
For M = 0 To plColNum
k = Arr(j, M)
Arr(j, M) = Arr(i, M)
Arr(i, M) = k
Next
End If
Next
Next
''''''''''''''''''''''''''''''''''''''''''''''''''''''
'lIndex(1) = 1
'plSort = 1
' For i = 2 To plRowNum
' M = lTempData(i)
' For j = 1 To plSort
' If (M > lTempData(lIndex(j))) Then Exit For
' Next
' plSort = plSort + 1
' For k = plSort To j + 1 Step -1
' lIndex(k) = lIndex(k - 1)
' Next
' lIndex(j) = i
' Next
' For i = 1 To plRowNum
' j = lIndex(i)
' For k = 1 To plColNum
' lSortData(i, k) = Arr(j, k)
' Next
' Next
' For i = 1 To plRowNum
' For k = 1 To plColNum
' Arr(i, k) = lSortData(i, k)
' Next
' NextEnd Sub
为何列数为KeyCol%=3时,不能正确排序,谢谢!!!
有问题再提出.Dim AA() As Integer
Private Sub Command1_Click()
'初始化
ReDim AA(2, 3) '这里有问题,上面定义的是3,4,而下面的下标却是0,开时
AA(0, 0) = 10
AA(0, 1) = 5
AA(0, 2) = 13
AA(0, 3) = 24AA(1, 0) = 3
AA(1, 1) = 55
AA(1, 2) = 43
AA(1, 3) = 2AA(2, 0) = 30
AA(2, 1) = 51
AA(2, 2) = 113
AA(2, 3) = 21
Call Sort(AA(), 2)
'显示
For i = 0 To 2
Me.Print AA(i, 0) & " " & AA(i, 1) & " " & AA(i, 2) & " " & AA(i, 3)
Next
End Sub
Sub Sort(Arr() As Integer, ByVal KeyCol%)
Dim plColNum&, plRowNum&, plSort&
Dim i&, j&, k&, M&
Dim lTempData&()
'初始化
plColNum = UBound(Arr, 2)
plRowNum = UBound(Arr, 1)
ReDim lTempData(plRowNum)
'把排序的列单独存入lTempData()数组
For i = 0 To plRowNum
lTempData(i) = Arr(i, KeyCol)
Next
'排序
For i = 0 To plRowNum
For j = i + 1 To plRowNum
If lTempData(i) > lTempData(j) Then
k = lTempData(j)
lTempData(j) = lTempData(i)
lTempData(i) = k
'根据lTempData()数组的排序,二维数组中的其他也做相应的调动.
For M = 0 To plColNum
k = Arr(j, M)
Arr(j, M) = Arr(i, M)
Arr(i, M) = k
Next
End If
Next
Next
End Sub
Dim i&, j&, k&, M&
Dim lIndex&(), lTempData&()
Dim lSortData&()
plColNum = UBound(Arr, 2)
plRowNum = UBound(Arr, 1)
ReDim lIndex(plRowNum), lTempData(plRowNum)
ReDim lSortData(plRowNum, plColNum)
For i = 0 To plRowNum
lTempData(i) = Arr(i, KeyCol)
Next
lIndex(0) = 0
plSort = 0
For i = 1 To plRowNum
M = lTempData(i)
For j = 0 To plSort
If (M > lTempData(lIndex(j))) Then Exit For
Next
plSort = plSort + 1
For k = plSort To j + 1 Step -1
lIndex(k) = lIndex(k - 1)
Next
lIndex(j) = i
Next
For i = 0 To plRowNum
j = lIndex(i)
For k = 0 To plColNum
lSortData(i, k) = Arr(j, k)
Next
Next
For i = 0 To plRowNum
For k = 0 To plColNum
Arr(i, k) = lSortData(i, k)
Next
NextEnd Sub