冒泡排序中,怎么知道排序后的各个数依次在原来数列中的位置。

解决方案 »

  1.   

    给你一个我编制的排序模块罢Sub BubbleSort(List() As Long, Number As Long, DataCount As Long, SmallToBig As Boolean)
    '/蒋玉龙于2003-03-08晚0:36编制,数组排序功能/'传递过来的数组,共2维,N组数据//根据第Number个数据信息排序//总共DataCount个数据信息
    '例如:X(N,4)→共N组数据,每组4个数据信息,分为/N,0/N,1/N,2/N,4/
    Dim First As Long, Last As Long
    Dim ii As Long, JJ As Long, KK As Long
    '定义一个可以保存一维多数据的临时变量
    Dim Temp() As Long
    ReDim Temp(DataCount)
    '***********************************************************
    '调用方法
    'Dim List(0 To 3, 0 To 2) As Long
    'Dim II As Long
    '
    'List(0, 0) = 15
    'List(0, 1) = 23 →用做排序
    'List(0, 2) = 62
    '
    'List(1, 0) = 43
    'List(1, 1) = 53 →用做排序
    'List(1, 2) = 34
    '
    'List(2, 0) = 46
    'List(2, 1) = 231→用做排序
    'List(2, 2) = 34
    '
    'List(3, 0) = 12
    'List(3, 1) = 13 →用做排序
    'List(3, 2) = 22
    '
    'BubbleSort List(), 2, 3, False
    '按照第2个信息排序,总共每维3组数据,从大到小
    '***************************************************************
    First = LBound(List, 1) '取得数组第1维上界
    Last = UBound(List, 1) '取得数组第1维下界——判断出来有多少数据
    'II是负责循环数据个数[维数],JJ是内层循环
    For ii = First To Last - 1  '冒泡排序法
        For JJ = ii + 1 To Last
            If SmallToBig = True Then '从小到大
                If List(ii, Number - 1) > List(JJ, Number - 1) Then
                    '记录第JJ个数据
                    For KK = 0 To DataCount - 1
                        Temp(KK) = List(JJ, KK)
                    Next
                    For KK = 0 To DataCount - 1
                      List(JJ, KK) = List(ii, KK)
                    Next
                    '恢复数据
                    For KK = 0 To DataCount - 1
                        List(ii, KK) = Temp(KK)
                    Next
                End If
            Else '从大到小
                If List(ii, Number - 1) < List(JJ, Number - 1) Then
                    '记录第JJ个数据
                    For KK = 0 To DataCount - 1
                        Temp(KK) = List(JJ, KK)
                    Next
                    For KK = 0 To DataCount - 1
                      List(JJ, KK) = List(ii, KK)
                    Next
                    '恢复数据
                    For KK = 0 To DataCount - 1
                        List(ii, KK) = Temp(KK)
                    Next
                End If
            End If
        Next
    Next
    End Sub
      

  2.   

    Option Explicit
    Dim i As Long, j As Long, t As LongDim a(10) As TextBox
    Private Sub Form_Activate()
    Randomize
    For i = 0 To 10
      Set a(i) = Text1(i)
      a(i).Text = Int(Rnd * 199) - 99
      a(i).BackColor = RGB(255, 255, 255)
    Next i
    Command1.Enabled = True
    Frame1.Height = 1980
    End Sub
    Private Sub Command1_Click()
    Command1.Enabled = False
    For i = 1 To 9
      Label2.Caption = " 从A(1)到A(" & Trim(11 - i) & _
         "),将相连两数进行比较,并将小者置前,A(" + Trim(11 - i) & _
          "),将为A(1)至A(" & Trim(11 - i) & ")中的最大者。“"
    For j = 1 To 10 - i
        a(j).BackColor = RGB(225, 0, 225): a(j + 1).BackColor = RGB(225, 0, 225)
      If Val(a(j).Text) > Val(a(j + 1).Text) Then
         MsgBox "交换A(" & Trim(j) & ")和A(" & Trim(j + 1) & ")", , "A(" & Trim(j) & ")>A(" & Trim(j + 1) & ")"
         t = a(j).Text: a(j).Text = a(j + 1).Text: a(j + 1).Text = t
      End If
       a(j).BackColor = RGB(225, 0, 225)
     Next j
     a(j).BackColor = RGB(0, 225, 0)
    Next i
    a(1).BackColor = RGB(0, 225, 0)
    Label2.Caption = " "
    Frame1.Height = 1000
    End Sub
    Private Sub Command2_Click()
     Form_Activate
    End Sub
    上面的调试运行成功,结果也很正确
      

  3.   

    在交换的时候,把数据原来的位置也一起记到另一个数组中。
    或者把他记到一个只有2列的2维数组中,第一列存放排序好的数据,第二列存放数据在原来数组中的位置。
    这是最慢的排序方法之一,可以考虑用Shell Sort,他排序5000个元素只要100ms左右,而bubble sort需要至少5秒好像(我记得)