江苏省高校计算机等级考试命题研究院 江苏省高校计算机等级考试辅导
江苏省二级VB常用算法(六)排序

VB常用算法(六)排序

曹苏群  http://caosuqun.bokee.com

关键词排序    算法                                          

1、算法说明

1)        选择法排序

 

(1)     n个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置;

(2)     除第一个数外,在剩下的n-1个数中再按方法(1)选出次小的数,与第二个数交换位置;

(3)     以此类推,最后构成递增序列。

譬如:

                                            8       6       9       3       2       7

第一轮交换后             2       6       9       3       8       7

第二轮交换后             2       3       9       6       8       7

第三轮交换后             2       3       6       9       8       7

第四轮交换后             2       3       6       7       8       9

第五轮无交换             2       3       6       7       8       9

 

 

程序代码如下:

Private Sub xzPaiXu(a() As Double, sheng As Boolean)

    'a为需要排序的数组,shengTrue则为升序排列,为False,则为降序排列。

    Dim i As Integer, j As Integer

    Dim temp As Double

    Dim m As Integer

    For i = LBound(a) To UBound(a) - 1     '进行数组大小-1轮比较

        m = i                             

'在第i轮比较时,假定第

                                           'i个元素为最值元素

        For j = i + 1 To UBound(a)         '在剩下的元素中找出最

                                           '值元素的下标并记录在m

            If sheng Then                  '若为升序,则m记录最小元素

                                           '下标,否则记录最大元素下标

                If a(j) < a(m) Then m = j

            Else

                If a(j) > a(m) Then m = j

            End If

        Next j                             '将最值元素与第i个元素交换

        temp = a(i)

        a(i) = a(m)

        a(m) = temp

    Next i

End Sub

 

调用该过程示例:

Option Base 1

Private Sub Command1_Click()

    Dim b(6) As Double

    b(1) = 8

    b(2) = 6

    b(3) = 9

    b(4) = 3

    b(5) = 2

    b(6) = 7

    Call xzPaiXu(b, True)

    For i% = 1 To 6

        Print b(i)

    Next

End Sub

 

2)        冒泡法排序

选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,最值数已经冒出。

譬如:

                                    8       6       9       3       2       7

8  6  9  3  2  7

8  6  9  2  3  7

8  6  2  9  3  7

8  2  6  9  3  7

2  8  6  9  3  7

                                    ….

                                   2  3  8  6  9  7

                                   ….

                                   2  3  6  8  7  9

                                   ….

                                   2  3  6  7  8  9

….

2  3  6  7  8  9

 

 

 

程序代码如下:

 

Private Sub mpPaiXu(a() As Double, sheng As Boolean)

    'a为需要排序的数组,shengTrue则为升序排列,为False,则为降序排列。

    Dim i As Integer, j As Integer

    Dim temp As Double

    Dim m As Integer

    For i = LBound(a) To UBound(a) - 1     '进行n-1轮比较

       

        For j = UBound(a) To i + 1 Step -1 'ni个元素两两进行比较

                                          

            If sheng Then                  '若次序不对,马上进行交换

                                          

                If a(j) < a(j - 1) Then

                    temp = a(j)

                    a(j) = a(j - 1)

                    a(j - 1) = temp

                End If

            Else

                If a(j) > a(j - 1) Then

                    temp = a(j)

                    a(j) = a(j - 1)

                    a(j - 1) = temp

                End If

            End If

        Next j                             '出了内循环,一轮排序结束

                                           '最值元素冒到最上边

    Next i

End Sub

 

调用该过程代码基本同上。

 

2、实战练习

1)        补充代码(2003秋二(10))

       下面是一个采用拉锯式排序法对数组元素按升序进行排序的程序,所谓拉锯式排序法是这一遍把最小的元素从下到上送到最上的位置,下一遍则是从上到下把最大的元素送到最下的位置。

 

                  Option Base 1

                  Private Sub Command1_Click()

                  Dim a(10) As Integer,i As Integer

                For i = 1 To 10

                   a(i) = Int(Rnd * 10)+1

                   Text1 = Text1 & Str(a(i))

                Next i

                Call shaker_sort(a)

                For i = 1 To 10

                   Text2 = Text2 & Str(a(i))

                Next i

                  End Sub

 

                  Private Sub Shaker_sort(k() As Integer)

                  Dim i As Integer,c As Integer,d As Integer

                  Dim t As Integer

                  c = 1

                  d =     1  

                  Do

                      For     2    Step-1

                         If k(i=1)>k(i) Then

                            t = k(i-1):k(i-1) = k(i):k(i) = t

                         End If

                      Next i

                          3  

                      For i = c+1 To d

                         If     4   Then

                            t = k(i-1):k(i-1) = k(i):k(i) = t

                         End If

                      Next i

                      d = d-1

                  Loop While     5  

                  End Sub

 

2)        编程题(2002秋上机试卷04

         把文本框输入的字符串按降序添加到列表框中。