排序算法及程序实现 知识点题库

采用冒泡排序对一组数据进行排序,第一遍排序后的结果为2,19,4,55,6,7,11,13,32,那么该数组的原始顺序不可能是(  )
A . 19,4,55,6,7,11,13,32,2 B . 2,19,4,55,13,11,32,6,7 C . 19,4,55,2,6,7,11,13,32 D . 19,4,55,6,7,11,2,13,32
【加试题】有VB程序段如下:

num = 0

  For i = 1 To 3

    For j = 8 To i + 1 Step -1

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

         temp = a(j): a(j) = a(i): a(i) = temp

num = num +1

      End If

    Next j

  Next i

数组元素a(1)到a(8)的值依次为“25,44,16,34,57,25,34,60”,执行该程序段,变量num的值是(  )

A . 3 B . 5 C . 7 D . 10
有如下VB程序段:

s=“7218634594” : n=Len(s): c=0

For i=1 To n-1

  a(i)=Val(Mid(s, i, 2))

Next i

For i=1 To n-2 Step 2

  k=i

  For j=i+2 To n-1 Step 2

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

  Next j

 If k <> i Then

   t=a(i): a(i)=a(k): a(k)=t: c=c+1

 End If

Next i

Text1.Text=Str(c)

该程序段运行后,Text1中显示的内容是(  )

A . 1 B . 2 C . 3 D . 4
小王编写“合并区间” VB程序,功能如下:窗体加载时,获取并存储合并前的区间数据,并显示在列表框List1中。单击“合并”按钮后,以区间左端点数值对区间进行升序排序,然后相邻区间的相交进行合并,最后在列表框List2上显示合并后的区间。程序运行如图所示:

实现以上功能的VB程序如下,在横处填入合适的代码。

Dim a(1 To 20) As Integer     ‘存储区间的左端点数值

Dim b(1 To 20) As Integer     ‘存储区间的右端点数值

Private Sub Form_Load()

‘将区间左端点存入数组a,区间右端点存入数组b,并在列表框List1显示,代码略

End Sub

Private Sub Command1_Click()

Dim i As Integer, j As Integer

Dim curL As Integer, curR As Integer

For i=1 To n-1

 For j=1 To n-i

  IfThen

   t=a(j): a(j)=a(j+1): a(j+1)=t

   t=b(j): b(j)=b(j+1): b(j+1)=t

  End If

 Next j

Next i

curL=a(1): curR=b(1)

For i=2 To n

 IfThen

  If curR < b(i) Then

 Else

  List2.AddItem“["+Str(curL)+Str(curR)+"]”

  curL=a(i): curR=b(i)

 End If

Next i

List2. AddItem “[”+Str(curL)+Str(curR)+“]”

End Sub

有如下VB程序段:

For i = 1 To n - 1

 t = n - (n + i) Mod 2

 For j = t To i + 2 Step -2

  If d(j) > d(j - 2) Then t = d(j):d(j) = d(j - 2):d(j - 2)= t

 Next j

Next i

已知n = 10,数组元素d(1)到d(10)的原始数据为1、2、3、4、5、6、7、8、9、10,程序运行后,d(10)的值为(  )

A . 9 B . 1 C . 2 D . 10
有如下程序段:

s = “”

For i=1 To 3

  For j = 7 To i + 1 Step-1

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

      k=a(1) : a(j) = a(-1) : a(j-1)=k

    End if

  Next j

  s= s+ Str(a(i))

Next i

Text1. Text = s

数组元素a(1)到a(7)的数据依次为3,9,1,5,8,6,,经过该程序段“加工”后,文本框Text1中显示的内容是(  )

A . 1,2,3 B . 9,8,6 C . 3,9,1 D . 8,6,2
编写VB程序,实现如下功能:程序运行时,单击命令按钮 Command1产生100个随机字符串(每个字符串的长度不超过10),并显示在列表框List1中单击命令按钮Command2对产生的100个随机字符串按权值进行降序排序,将排序结果显示在列表框List2中。每个字符串的权值定义为该字符串中ASCⅡ码值最大的学母的ASCⅡ码值,例如字符串“Hello”中ASC码值最大的字母是“o”(ASCⅡ码值为111),则字符串“Hello”的权值为111。程序运行效果如图所示。

实现上述功能的VB代码如下,在划线处填入合适的代码。

Dim a (1 To 100) As String   ‘ 依次存放100个随机字符串

Dim b (1 To 100) As Integer   ‘ 依次存放每个字符串的权值

Private sub command1_Click( )   ‘ 产生100个随机字符串

Dim i As Integer, k As Integer, j As Integer,x As Integer

For i=1 To 100

  k=Int (Rnd*7+3)   ‘k表示第i个字符串的长度

  For j = 1 To k   ‘通过循环产生第i个字符串并存储在a(i)中

    If Int(Rnd*2+1) = 1 Then   ‘ 产生一个小写字母的 ASCⅡ码值

      x = Asc("a")+ Int (Rnd*26)

    Else

      x = Asc("A") + Int(Rnd*26) ‘ 产生一个大写字母的ASCⅡ码值

          ①        

    a(i) = a(i)+Chr (x)

  Next j

  List1 AddItem a(i)

Next i

End Sub

Private sub command2_Click( )’ 对100个字符串按字符串权值降序排序

Dim i As Integer, j As Integer, y As Integer, s As string

For i =1 To 99

  k =1

  For = i + 1 To 100

          ③      

  Next j

  If k <> Then

    s = a(k) : a(k) = a(1) : a(1) = s

    y = b(k) : b(k) = b(1):b(i) = y

  End If

Next i

For i=1 To 100

  List2 AddItem a(i)

Next i

End sub

 ② ③ 

有一组原来按升序排列的正整数,第p个至第q个数据(p和q的值分别由文本框Text1和Text2输入,且p<q)的区间被打乱,其他数据的位置不变,小陈首先依据冒泡排序的思想对该区间中的数据进行升序排序使得整组数据恢复升序排列,然后依据对分查找的思想在该组数据中查找满足[k1, k2](k1和k2的值分别由文本框Text3和Text4输入,且k1<k2)范围的数据个数并显示在标签Label1中。相关示例如下(其中p=4,q=7,k1=70,k2=80)。

排序前

55

70

70

78

71

79

75

80

80

90

排序后

55

70

70

71

75

78

79

80

80

90

查找该组数据中满足[k1, k2]范围的数据个数为:8

实现上述功能的VB程序如下,请回答下列问题:

  1. (1) 下列对象中没有Caption属性的是 (单选,填字母:A . 标签 Label1 /B . 命令按钮 Command1 /C . 文本框 Text1)。
  2. (2) 程序加框处代码有错,请改正。

    Private Sub Command1_Click()

    Const n = 10

    Dim a(1 To n) As Integer, k As Integer

    Dim i As Integer, j As Integer, k1 As Integer, k2 As Integer

    Dim p As Integer, q As Integer 

    Dim b As Integer      '查找满足条件的第一个数据所在数组元素的下标

    '读取排序前的一组正整数,存储在数组a中。代码略

    p= Val(Text1.Text)

    q = Val(Text2.Text)

        For i = p To q - 1

            For j =  Step -1

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

                    k = a(j): a(j) = a(j - 1): a(j - 1) = k

                End If

            Next j

        Next i

        k1 = Val(Text3.Text) 

        k2 = Val(Text4.Text) 

        i = 1: j = n

        Do While i <= j

            m = (i + j) \ 2

            If   ①    Then

                i = m + 1

            Else

                j = m - 1

            End If

        Loop

        b =    ②   

        i = 1: j = n

        Do While i <= j

            m = (i + j) \ 2

            If a(m) <= k2 Then

                i = m + 1

            Else

                j = m - 1

            End If

        Loop

    Label1.Caption = Str   ③     

    End Sub

  3. (3) 请在划线处填入合适的代码。

     ② ③ 

某医院每天提前发放100个预约号。考虑到老年人身体,预约的病人按照以下规则进行就诊:

①老年人(年龄≥60岁)比非老年人优先就诊;

②老年人按年龄从大到小的顺序就诊,年龄相同的按预约顺序就诊;

③非老年人按预约顺序就诊。

小王根据以上规则编写了一个VB程序,通过引入索引数组temp进行排序,使得age(temp(1))≥age(temp(2))≥age(temp(3))…≥age(temp(n))。如图a所示。

图a

图b

程序运行时,病人的数据显示在列表框List1中,单击“就诊排序”按钮Command1,排序结果显示在列表框List2中,程序运行界面如图b所示。

实现上述功能的VB程序如下,请回答下列问题:

  1. (1) 分析程序,可知程序中读取的数据库工作表名称为
  2. (2) 请在画线处填入合适的代码。

    Dim pname(1 To 100)As String           ‘存放病人姓名

    Dim age(1 To 100)As Integer             ‘存放病人年龄

    Dim num(1 To 100)As Integer            ‘存放病人序号

    Dim n As Integer

    Private Sub Command1_Click( )

      Dim temp1(1 To 100)As Integer, temp2(1 To 100)As Integer   ‘索引数组

      Dim i As Integer, j As Integer, k1 As Integer, k2 As Integer, t As Integer

      k1=0:k2=0

      For i=1 To n

          If age(i)<60 Then

          k1=k1+1

        temp1(k1)=num(i)

      Else

          k2=k2+1

          temp2(k2)=num(i)

        End If

    Next i

    For i=1 To k2-1

        For j=k2 To i+1 Step-1

          If   ①   Then

              t=temp2(j):temp2(j)=temp2(j-1):temp2(j-1)=t

          End If

        Next j

    Next i

    List2.Clear

    List2.Addltem "就诊号  名单   年龄"

    For i=1 To k2

        List2.Addltem Str(i)&."  "&.pname(temp2(i))&"r/&.Str(age(temp2(i)))

    Next i

    For j=1 To k1

        List2.Addltem   ②   &"    "&pname(templ(j)&"   "&.Str(age(templ(j)))

    Next j

    End Sub

    Private Sub Form_Load( )

      Dim conn As New ADODB. Connection, rs As New ADODB. Recordset

      Conn.ConnectionString="Provider=Microsoft. ACE. OLEDB. 12.0;DataSource="&App. Path&"\pdxt.accdb"

      conn.Open

      Set rs. ActiveConnection=conn

      rs. Open"select*from jzmd"

      n=0

      List1.AddItem"预约号   名单   年龄"

      Do While Not rs. EOF

           ③   

        num(n)=n

        pname(n)=rs. Fields(1)

        age(n)=rs Fields(2)

        List1. Addltem Str(num(n))&"  "&-pname(n)&."  "&.Str(age(n))

        rs. MoveNext

      Loop

      rs.Close:conn.Close

    End Sub

    以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③

使用选择排序算法对数据7,1,5,8,4从小到大排序,需要进行数据交换的次数是(  )
A . 5 B . 2 C . 3 D . 4
某排序算法的VB程序段如下:

For i=1 To 3

  k=i

  For j=i+1 To 6

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

    Next j

    t=a(i):a(i)=a(k):a(k)=t

Next i

若数组元素a(1)到a(6)的值依次为“8,2,9,3,5,1”,则经过该程序段“加工”后,数组元素a(1)到a(5)的值依次为(  )

A . 8,2,9,3,5,1 B . 9,2,8,3,5,1 C . 9,8,5,2,3,1 D . 9,8,5,3,2,1
某班级学生为毕业晚会的一个男生节目设计一个仿“V”字队形,先筛选出班级里所有男生,然后将参演的所有男生按照身高,摆出中间低两边高(先右后左)的队形,如图1所示。

图1

小孟同学用VB编写模拟“节目队形”程序,功能如下:从数据库中导入所有学生的编号、性别和身高数据;单击“筛选并排序”Command1按钮,筛选出所有男生的身高并按照从低到高的顺序进行排序,结果显示在文本框Text1中;单击“设计队形”Command2按钮,队形的编号结果显示在文本框Text2中。程序运行界面如图 2 所示。

图2

举例说明如下:

实现上述功能的 VB 程序如下,请回答下列问题:

  1. (1) 请在划线处填入合适的代码。

    Const n = 8

    Dim h(1 To n) As Integer, num1(1 To n) As Integer, num2(1 To n) As Integer Dim sex(1 To n) As Boolean        '男生 sex = True,女生 sex = False

    Dim i As Integer, j As Integer, m As Integer

    Private Sub Form_Load()

    'n名学生(包括男生和女生)的编号、性别和身高由数据库导出,分别存储在数组num1、h和sex中,代码略!

    End Sub

    Private Sub Command1_Click()

      For i = 1 To n - 1

        For j = n To i + 1 Step -1

            If sex(j) = True Then

                If Then

                    t = h(j): h(j) = h(j - 1): h(j - 1) = t

                    t = sex(j): sex(j) = sex(j - 1): sex(j - 1) = t

                    t = num1(j): num1(j) = num1(j - 1): num1(j - 1) = t

                End If

            End If

        Next j

      Next i

      For i = 1 To n

        If sex(i) Then

            Text1.Text = Text1.Text + " " + Str(h(i))

        End If

        If Not sex(i) Then : Exit For      '改错

      Next i

    End Sub

    Private Sub Command2_Click()

      Dim L, R As Integer, mid As Integer

      mid = Int((1 + m) / 2) L = 0: R = 0

       

      For i = 2 To m Step 2

        R = R + 1

        num2(mid + R) = num1(i)

        L = L + 1

         

      Next i

      For i = 1 To m

        Text2.Text = Text2.Text + " 男" + CStr(num2(i)) + "号 "

      Next i

    End Sub

  2. (2) 程序代码中,加框处有错,请改正。
某分段排序算法描述如下:

1)将原始数据按升序分成若干有序段。

2)将第1段和第2段进行合并,使得合并后的数据依旧有序,得到新的有序段。

3)将新的有序段再次和下一个有序段进行合并。

4)重复上述操作,直到全部数据变成一个有序段为止,排序结束。

如数据:1、3、9、4、5、7、2、6,第1段为1、3、9,第2段为4、5、7,将第1段和第2段合并,得到新的第1段为1、3、4、5、7、9。继续和下一段2、6进行合并,合并后段数变为1段,则排序结束。

编写VB程序,实现分段排序功能:在文本框Text1中输入数据总量,单击“数据生成”按钮Command1后,在列表框List1中显示原始数据,然后单击“分段排序”按钮Command2,在列表框List2中显示排序后的结果。程序运行界面如图所示。

图片_x0020_100014

请回答下列问题:

  1. (1) 若要清空列表框List1,下列代码正确的是(单选,填字母:

    A .List1.Clear / B .List1.List="" / C .List1.Text="" / D .List1.Caption="空白" )。

  2. (2) 实现分段排序功能的VB程序如下,请在划线处填入合适的代码。

    Dim a(1 To 1000) As Integer

    Dim n As Integer

    Private Sub Command1_Click()

    '输入数据总量n,随机生成n个数据保存在数组

    'a(1)~a(n)中,并在List1中显示数据,代码略

    End Sub

    Private Sub Command2_Click()

        Dim b(1 To 10000) As Integer

        Dim p1 As Integer, p2 As Integer, t1 As Integer, t2 As Integer

        Dim t As Integer, k As Integer, i As Integer, j As Integer

        p1 = 1

        t1 = leng(p1)

        p2 = p1 + t1

        Do While p2 <= n

            

            i = p1: j = p2: t = 1

            Do While i < p2 Or j < p2 + t2

                If j >= p2 + t2 Or i < p2 And a(i) < a(j) Then

                    b(t) = a(i): i = i + 1

                Else

                    b(t) = a(j): j = j + 1

                End If

                t = t + 1

            Loop

            For k = 1 To

                a(k) = b(k)

            Next k

            t1 = t1 + t2

             图片_x0020_100015

        Loop

        '在List2中输出数组a(i)的值,代码略

    End Sub

    Function Leng(ByVal p As Integer) As Integer

    '该函数返回数组a中数组下标p开始的升序有序段的长度,代码略

    End Function

  3. (3) 程序中加框处代码有错,请改正。
某VB程序部分程序段如下:

For i=1 To n-1

    For j=________

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

            t=a(j): a(j)=a(j-1): a(j-1)=t

        End If

    Next j

Next i

为了使此程序段能实现数组a中的数据升序排列,则划线处应填入的代码是(   )。

A . 1 to n-I B . 2 to n-i+1 C . n to i+1 D . i+1 to n
有如下VR程序段:

tail=6: i=1: r=2

Do While i<r

    For j= tail To i+1 Step-1

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

            t=a(j):a(j)=a(j-1):a(j-1)=t

        End If

    Next j

    i=i+1

    For j=i To tail-1

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

            t=a(j):a(j)=a(j+1):a(j+1)=t

        End If

    Next j

    tail=tail-1

Loop

数组元素值“73、56、28、61、44、92”,运行程序,数组元素a(1)到a(6)的值依次为(   )

A . 73,61,56,92,44,28 B . 92,73,56,61,44,28 C . 92,73,61,56,28,44 D . 92,73,61,56,44,28
某图书馆整理系统会自动将借阅归还的书籍按照书籍编号从小到大进行排序,以便于图书管理员查阅各阅览室书籍的在架情况。小明模仿该系统设计了如下程序,程序运行时,会自动对在架的书籍根据编号进行升序排序,在文本框Text1中输入阅览室编号,点击“查询”按钮,程序会将该阅览室的所有书籍及其对应的位置和书名全部输出到列表框List1中,如图所示。已知该图书馆分成四个阅览室,1号阅览室放置图书大类为A-F的书籍,2号阅览室放置图书大类为G-N的书籍……以此类推,每本书的编号第一位代表该书所属的图书大类。

实现上述功能的VB程序如下,请回答下列问题:

  1. (1) 下列属于VB窗体文件的是               (单选,填字母)。
    A . dj.vbp B . dj.frm C . jd.exe D . dj.Vbw
  2. (2) 请在划线处填上合适的代码。

    Dim book(1 To 100) As String    '存储书籍的编号

    Dim bname(1 To 100) As String    '存储书籍的书名

    Dim pos(1 To 100) As String       '存储书籍所在阅览室的位置

    Dim rroom(1 To 4) As String       '存储每个阅览室存放书籍的大类

    Dim n As Integer'在架书籍总数

    Private Sub Form_ Load ()

    '在架书籍根据编号进行升序排序,书籍编号、书籍名称和所在阅览室的位置分别存放在数组book、bname 和pos中,在架书籍总数为n,代码略

        rroom(1)="ABCDEF":rroom(2)="GHIJKN"

        rroom(3)="OPQRST":rroom(4)="UVXZ"     '每个阅览室存放的书籍大类

    End Sub

    Private Sub Command1_Click ()

        Dim id As Integer,i As Integer,key1 As String,key2 As String,flag As Integer

        Dim start1 As Integer,end1 As Integer

        id = Val(Text1. Text)

        key1= Mid(rroom(id),1,1)

        key2=

        start1 =check (key1,1)

        end1 = check (key2,-1)

        For i = start1 to

            List1.AddItem "编号:"+gs(book(i))+"位置:"+gs(pos(i))+"书名:"+gs (bname(i))

        Next i

    End Sub

    Function check(key As String, flag As Integer) As Integer

        Dim left As Integer, right As Integer, m As Integer

        left=1:right=n

        Do While left <= right

            m= (left + right) \ 2

            If  Then

                right= m - 1

            Else

                left=m+1

            End If

        Loop

        check = left

    End Function

    Function gs(s As String) As String

        Dim i As Integer

        For i=1To15-Len(s)

            s=s+""

        Next i

        gs=S

    End Function

  3. (3) 程序加框处代码有错误,请改正。
有如下VB程序段

Dim a(1 to 5) as integer

Dim b(1 to 20) as integer

a(1)=10: a(2)=9: a(3)=17: a(4)=18: a(5)=13

for i=1 to 5

b(a(i))=b(a(i))+1

next i

num =0

for j=1 to 20

for k=1 to b(j)

num=num+1

a(num)=j

next k

next j

执行该程序段后,数组元素a(1)到a(5)的值依次为(    )

A . 18,17,13,10,9 B . 9,10,13,17,18 C . 17,18,9,10,13 D . 9,18,10,17,13
某会场每天会收到众多举办活动的申请。现需对活动申请进行统筹安排,以确保会场在同一时间内只安排一个活动且每天安排尽可能多的活动。具体规定如下:

●对各个活动按结束时间先后进行升序排序,若结束时间相同,按开始时间先后升序排序。

●先安排结束时间最早的活动,依次考虑未安排的活动,如果和已安排的活动没有时间冲突,则予以安排;否则,不予安排。

小明为此编写了VB程序,功能如下:在列表框List1读取活动编号、活动时间(开始时间-结束时间)。按编号依次显示。单击“统筹安排”按钮Command1,对申请的活动按规定进行排序,并在列表框List2中输出当天能安排的活动编号、活动时间和数量。程序运行界面如图所示:

  1. (1) 某天收到8个活动申请,各活动时间(开始时间-结束时间)分别为“07-12,10-13,14-20,09-12, 12-15,09-11,10-12,08-10”。根据上述规定,当天最多能安排个活动。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Dim a(1 To 100)As Integer, b(1 To 100)As Integer, c(1 To 100)As Integer

    Dim m As Integer

    Private Sub Form_Load( )

        '从数据库中读取活动编号、开始时间和结束时间,分别存储在数组c、a、b中,并在列表框list1中显示;统计收到的活动申请数量,存储在变量m中

        '代码略

    End Sub

    Private Sub Command1_ Click( )

        Dim i As Integer,j As Integer,k As Integer

        Dim temp As Integer,n As Integer, last As Integer

        '对各个活动按时间进行排序

        For i=1 To m-1

            k=i

            For j=i+ 1 To m

                If b(c(j)) < b(c(k)) Then

                    k=j

                ElselIf Then

                    k=j

                End If

            Next j

            If k<> I Then

                temp = c(k):e(k) = c(i): c(i)=temp

            End If

        Next i

        last = b(c(1))

        'CStr(n)将n转换成字符串并去除字符串前空格

        List2.AddItem " "+ adj((c(1)),4)+ CStr(a(c(1)))+ "-" + CStrb(c(1)))

       

        For i= 2 To m

            If a(c(i)) >= last Then

                List2.AddItem " "+ adj((c(i)),4)+ CStr(a(c(i)))+ "-" + CStrb(c(i)))

                n=n+ 1

            End If

        Next i

        List2.AddItem “最多能安排" & CStr(n)& "个活动”

    End Sub

    Function adj(a A s String, b A s Integer)

        '将字符串对齐输出,代码略

    End Function

某VB程序段如下:

n= 6

For i= 1 To 2

    k=i

    j=i+ 1

    Do While j<= 3

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

        j=j+ 1

    Loop

    If i<> k Then

        t= a(i): a(i) = a(k): a(k)= t

    End If

    m=n-i+ 1

    For j= m- 1 To 4 Step -1

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

    Next j

    If m<>n-i+ 1 Then

        t= a(n-i+1):a(n-i+ 1)= a(m): a(m)= t

    End If

    t= a(i): a(i)= a(n-i+ 1):a(n-i+ 1)=t

Next i

数组元素a(1)到a(6)的初始值依次为“39,40,35,21,33,32”,运行程序后,a(4)的值是(    )

A . 39 B . 35 C . 33 D . 32
给定一个序列a,这个序列由n个数组成(n个数依次保存在数组a(1)~a(n)中),现在给定一个整数p,要求将序列a的前p个数与后n-p个数对调,且不改变这p个数(和n-p个数)之间的相对位置。例如长度为5的序列1,2,3,4,5,当p=2时重排的结果为3,4,5,1,2。

我们可以用两种不同的方法来实现这一目的:

方法一:逐个地将数组a的后n-p个数依次移动到前面去。

数组 a:

1

2

3

4

5

3

1

2

4

5

3

4

1

2

5

3

4

5

1

2

方法二:将前p个数看作一个区间,后n-p个数看作另一个区间,依次将数交换,同时缩小区间的大小;若某一个区间达到末尾,则调整区间的范围,直到两个区间刚好同时达到末尾,即调整结束。

数组a:

互换并调整区间:第一个区间结束且第二个区间还有元素,调整区间 1 和区间 2 的范围,如图将区间 1 调整为[3,4],区间 2 调整为[5:5]。

互换并调整区间:第二个区间结束且第一个区间还有元素,仅调整第 1 个区间的起始位置。

互换并结束:两个区间同时到达末尾。

3

4

5

1

2

小明依据上面的方法设计了VB程序如下:

Dim a(1 To 100), i As Integer, j As Integer, tmp As Integer, p As Integer

Dim start1 As Integer, end1 As Integer, start2 As Integer, end2 As Integer   '将序列保存到数组a中,序列长度保存到n中,移动数字的个数保存在p中

Private Sub Command2_Click()       '用方法一实现

    For i = p + 1 To n

        tmp = a(i)

        For j = i To  ①   Step -1

            a(j) = a(j - 1)

        Next j

           ②   = tmp

    Next i

End Sub

Private Sub Command3_Click()      '用方法二实现

    start1 = 1: end1 = p      '第1个区间的起始状态

    start2 = p + 1: end2 = n      '第2个区间的起始状态

    i = start1: j = start2

    Do While   ③  

        i = start1: j = start2

        Do While i <= end1 And j <= end2

            tmp = a(i): a(i) = a(j): a(j) = tmp

            i = i + 1:j = j + 1

        Loop

        If i <= end1 Then     '第2个区间结束且第1个区间还有元素

            start1 = i

        ElseIf j <= end2 Then   '第1个区间结束且第2个区间还有元素

            start1 = i:   ④  

            start2 = j

        End If

    Loop

End Sub

请回答下列问题:

  1. (1) 若序列为:9,8,13,22,7,6,5,37,6,p=4 时,使用方法一,则a(3)的值依次是13,(用逗号隔开,顺序填写曾存储过的值)。
  2. (2) 请在划线处填入合适的代码。

     ② ③ ④