none
求一段二维数组排序代码(VB6) RRS feed

  • 问题

  • 我有一个二维数组,并赋值如下:
    Dim a(3, 3) As Integer
    Dim t(3) As Integer
    a(0, 0) = 24: a(0, 1) = 25: a(0, 2) = 82: a(0, 3) = 11'对应到表格中的第一行0-3列
    a(1, 0) = 24: a(1, 1) = 25: a(1, 2) = 82: a(1, 3) = 34'对应到表格中的第二行0-3列
    a(2, 0) = 61: a(2, 1) = 79: a(2, 2) = 24: a(2, 3) = 33'对应到表格中的第三行0-3列
    a(3, 0) = 24: a(3, 1) = 79: a(3, 2) = 25: a(3, 3) = 27'对应到表格中的第四行0-3列

    想实现的排序过程是这样的:
      先对第一列进行升序排列后,如果相邻两行的第一列值相等,则比较第二列大小并按升序排列,如果该两行的第一列和第二列的值都相同,则比较第三列...依次类推.
       不知道我的意思说明白了没有.以下是我想实现的排序结果:

       61   79   24   33
       24   79   25   27
       24   25   82   34
       24   25   82   11

    求此二维数组排序的通用过程代码,多谢关注!
    2009年3月13日 6:15

答案

  • 思路就是先转为一维数组后再排序

    Dim a(3, 3) As Integer 
    Dim t(3) As Integer 
    a(0, 0) = 24: a(0, 1) = 25: a(0, 2) = 82: a(0, 3) = 11 '¶ÔÓ¦µ½±í¸ñÖеĵÚÒ»ÐÐ0-3ÁÐ  
    a(1, 0) = 24: a(1, 1) = 25: a(1, 2) = 82: a(1, 3) = 34 '¶ÔÓ¦µ½±í¸ñÖеĵڶþÐÐ0-3ÁÐ  
    a(2, 0) = 61: a(2, 1) = 79: a(2, 2) = 24: a(2, 3) = 33 '¶ÔÓ¦µ½±í¸ñÖеĵÚÈýÐÐ0-3ÁÐ  
    a(3, 0) = 24: a(3, 1) = 79: a(3, 2) = 25: a(3, 3) = 27 '¶ÔÓ¦µ½±í¸ñÖеĵÚËÄÐÐ0-3ÁÐ  
     
    Dim s(3) As String 
    Dim i As Integer, j As Integer 
    For i = 0 To 3  
        For j = 0 To 3  
            s(i) = s(i) & Format(a(i, j), "0000000000")  
        Next 
        s(i) = s(i) & Format(i, "0000000000")  
    Next 
     
    For i = 0 To 3  
        For j = i + 1 To 3  
            If s(i) < s(j) Then 
                Dim tmp As String 
                tmp = s(j)  
                s(j) = s(i)  
                s(i) = tmp  
            End If 
        Next 
    Next 
     
     
    For i = 0 To 3  
        j = Right(s(i), 10)  
        Debug.Print a(j, 0); a(j, 1); a(j, 2); a(j, 3)  
    Next 

    http://feiyun0112.cnblogs.com/
    2009年3月13日 6:55
    版主

全部回复

  •  你好!
    找到一段,希望对你有帮助!
    Sub dSort()Sub dSort(a() As LongByVal keyCol As Integer)
    ''''''''''''''''''''''''''''''''''
    '
    dSort子程序
    '
    a()数组,只能传入二维数组
    '
    keycol参数是要排序的列
    '
    '''''''''''''''''''''''''''''''''''

    Dim Row As Long
    Dim Col As Long
    Dim idx() As Long '存放需要排序的列
    Dim index() As Long '存放一个索引.方便操作其他非排序列
    Dim i As Long
    Dim j As Long
    Dim temp As Long
    Dim b() As Long '一个过渡的二维数组.

    '初始化
    Row = UBound(a, 1)
    Col 
    = UBound(a, 2)
    ReDim b(Row, Col)
    ReDim idx(Row)
    ReDim index(Row)

    '初始化排序的列的数组,及索引数组
    For i = 0 To Row
     idx(i) 
    = a(i, keyCol)
     index(i) 
    = i
    Next

    '根据排列的数组对索引列排序
    '
    使用快速排序法
    QkSort idx, 0, Row, index

    '整个二维数组,根据索引进行排序.
    For j = 0 To Col
      
    For i = 0 To Row
        b(i, j) 
    = a(index(i), j)
      
    Next
    Next
    For i = 0 To Row
      
    For j = 0 To Col
        a(i, j) 
    = b(i, j)
      
    Next
    Next

    End Sub


    周雪峰
    2009年3月13日 6:49
    版主
  • 思路就是先转为一维数组后再排序

    Dim a(3, 3) As Integer 
    Dim t(3) As Integer 
    a(0, 0) = 24: a(0, 1) = 25: a(0, 2) = 82: a(0, 3) = 11 '¶ÔÓ¦µ½±í¸ñÖеĵÚÒ»ÐÐ0-3ÁÐ  
    a(1, 0) = 24: a(1, 1) = 25: a(1, 2) = 82: a(1, 3) = 34 '¶ÔÓ¦µ½±í¸ñÖеĵڶþÐÐ0-3ÁÐ  
    a(2, 0) = 61: a(2, 1) = 79: a(2, 2) = 24: a(2, 3) = 33 '¶ÔÓ¦µ½±í¸ñÖеĵÚÈýÐÐ0-3ÁÐ  
    a(3, 0) = 24: a(3, 1) = 79: a(3, 2) = 25: a(3, 3) = 27 '¶ÔÓ¦µ½±í¸ñÖеĵÚËÄÐÐ0-3ÁÐ  
     
    Dim s(3) As String 
    Dim i As Integer, j As Integer 
    For i = 0 To 3  
        For j = 0 To 3  
            s(i) = s(i) & Format(a(i, j), "0000000000")  
        Next 
        s(i) = s(i) & Format(i, "0000000000")  
    Next 
     
    For i = 0 To 3  
        For j = i + 1 To 3  
            If s(i) < s(j) Then 
                Dim tmp As String 
                tmp = s(j)  
                s(j) = s(i)  
                s(i) = tmp  
            End If 
        Next 
    Next 
     
     
    For i = 0 To 3  
        j = Right(s(i), 10)  
        Debug.Print a(j, 0); a(j, 1); a(j, 2); a(j, 3)  
    Next 

    http://feiyun0112.cnblogs.com/
    2009年3月13日 6:55
    版主
  • 多谢两位版主!特别是feiyun0112版主的代码转换为我要的通用过程后很好用!
    只是还想请feiyun0112版主在楼上代码基础上再指点一二:
    假如数组a(3,3)中某一个值是含有二位小数的话,debug.print的结果怎么能保持原有的小数呢?
    我将定义中的a(0,1)赋值为25.36,但是debug.print的结果是25,怎么解决呢?
    再次致谢!
    2009年3月13日 8:28
  •  Dim a(3, 3) As double
    热烈庆祝进入4星活跃用户队伍
    有原则的回答问题: 不懂的不去装懂,别人回答得很完整的,没有需要补充的不去蹭分。
    2009年3月13日 8:40
  •  

     整数类型不能保存小数,vb做了隐式转换


    Dim i As Integer
    i = 25.36
    MsgBox i


    如果要保存小数,必须Dim a(3, 3) As double

    上面的代码也要改一点

    s(i) = s(i) & Format(a(i, j), "00000000.00") 


    http://feiyun0112.cnblogs.com/
    2009年3月13日 8:45
    版主
  •  feiyun0112的热忱帮助下,问题已解决!
    多谢楼上各位朋友热心帮助,没想到这么及时回复,万分感谢!!!

    以下是我写的通过过程(VB6中通过,但转换为ASP代码时出错,请帮助解决):
    Private Sub Sort(a)'此过程在VB6中调用通过
    'Dim s(3) As String
    Dim s() As String
    d = UBound(a, 1): t = UBound(a, 2)
    ReDim s(t)
    Dim i As Integer, j As Integer
    For i = 0 To d
        For j = 0 To t
            s(i) = s(i) & Format(a(i, j), "0000000000.00")
        Next
        s(i) = s(i) & Format(i, "0000000000.00")
    Next
    For i = 0 To d
        For j = i + 1 To t
            If s(i) < s(j) Then
                Dim tmp As String
                tmp = s(j)
                s(j) = s(i)
                s(i) = tmp
            End If
        Next
    Next
    For i = 0 To d
        j = Right(s(i), 10)
       For b = 0 To t
         Print a(j, b) & "      ";
       Next
    Print
    Next
    End Sub
    '下面是转换为ASP过程:
    Sub Sort(a)
    Dim s()
    d = UBound(a, 1)
    t = UBound(a, 2)
    ReDim s(t)
    Dim i,j
    For i = 0 To d
        For j = 0 To t
            s(i) = s(i) & Format(a(i, j), "0000000000.00")'在这一句出错,提示为下面的注释部分
         'Microsoft VBScript 运行时错误 (0x800A000D)
         '类型不匹配: 'format'
        Next
        s(i) = s(i) & Format(i, "0000000000.00")
    Next
     
    For i = 0 To d
        For j = i + 1 To t
            If s(i) < s(j) Then
                Dim tmp
                tmp = s(j)
                s(j) = s(i)
                s(i) = tmp
            End If
        Next
    Next
    End Sub
    2009年3月13日 8:58