二维数组大小排序求教高手,谢谢!!!有一个数组:
如: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

解决方案 »

  1.   

    aa(i,2) 和 aa(i,3)的排序啊
      

  2.   

    谢谢:我知道,但我写的不对:
    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
      

  3.   


    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
      

  4.   

    谢谢Chen8013 :
    就是这个意思,还请帮助,谢谢!!!
      

  5.   

    给你一段程序: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  这是针对数字类型的二维数组,以单关键字降序排序的代码。
      你理解了原理后,适当修改就能完成多关键字、混合数据类型表的排序了。
      

  6.   

    不好意思,还请你帮助看看,谢谢!!!
    原数组:
    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
      

  7.   

    帮你修改了一下,应该可以了。
    我把你多余的部分改成注释,
    并且列是由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
      

  8.   

    楼主如果加了Option Base 1,一定要去掉。
      

  9.   

    发现了一个问题,上面发的代码作废.我重新发.
    问题在代码中注明.
    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
      

  10.   

    谢谢谢:
    为何列数为KeyCol%=3时,不能正确排序,谢谢!!!
      

  11.   

    确实有问题,解决了,我帮你整理一下,加了简单的注释.
    有问题再提出.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
      

  12.   

      回复10楼:  我已说过:我是按照数组下标从1开始来处理的,而你定义的数组AA()的下标却是从0开始的,因此不能得到正确的结果!  以下标0开始的降序排序代码如下:Sub Sort(Arr() As Integer, KeyCol%)    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 = 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
      

  13.   

    调用Sort()时,KeyCol也是从0开始.