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

【加试题】用VB设计查询并统计某公司的销售数据。实现如下功能:①将所有员工的姓名和销售量存储到数组xm和xse中;②对销售量数组进行求和,并输出该地区平均销售量(保留整数);③根据输入“销售排名前几位”筛选出排名前几位销售人员的数据。程序运行界面如图所示。

  1. (1) 下列程序对员工的销售额进行排序的主要算法属于(选填:解析算法/枚举算法/冒泡排序算法/选择排序算法)
  2. (2) 实现上述功能的VB程序如下。请在划线处填入合适的代码。

    Dim xse(1 To 3000) As Long '存储销售员工的销售量,最大处理个数为3000

    Dim xm(1 To 3000) As String '存储销售员工的姓名

    Dim mc(1 To 3000) As Integer  '存储销售员工的名次

    Dim num As Integer  '当前员工总数

    Private Sub Form_Load()

    '将销售量、姓名数据存入xse和xm数组

       '计算员工总数num

       '代码略

    End Sub

    Private Sub Command1_Click()

       Dim sum As Long

       Dim i As Integer, flag As Integer

       pm = Val(Text2.Text)

       dq = Text1.Text

       sum = 0

       For i = 1 To num

          sum = sum + xse(i)

       Next i

       For i = 1 To pm      '对员工销售量进行排序

         For j =  To  i + 1 Step -1

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

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

                st = xm(j - 1): xm(j - 1) = xm(j): xm(j) = st

            End If

         Next j

       Next i

       mc(1) = 1

       For i = 2 To pm

        If  Then

            mc(i) = mc(i - 1)

        Else

            mc(i) = i

        End If

       Next i

       List1.Clear

       List1.AddItem "排名" + "姓名" + "销售量"

       For i = 1 To pm

        List1.AddItem Str(mc(i)) + "  " + xm(i) + "   " + Str(xse(i))

       Next i

        List1.AddItem dq + "平均销售额约为:" +

    End Sub

【加试题】有一组正整数,要求仅对其中的素数进行升序排序。排序后素数在前,非素数在后。排序示例如下。

排序前

86

71

5

41

81

79

37

89

排序后

5

37

41

71

79

89

86

81

实现上述功能的VB程序如下,但加框处代码有错,请改正。

Const n=8

Dim a(1 To n)  As Integer

Private Sub Command1_Click()

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

  Dim flag As Boolean

  ‘读取一组正整数,存储在数组a中。代码略

  For i=1 To n-1

               ‘(1)

If IsPrime(a(k))Then flag=True Else flag=False

      For j=i+1 To n

        If IsPrime(a(i))Then

          If  Then       ‘(2)

            k=j

            flag=True

           End If

       End If

    Next j

    If k<>i Then

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

    End If

    If Not flag Then Exit For     ‘Exit For表示退出循环

  Next i

  ‘依次输出排序后的数据。代码略

End Sub

Function IsPrime(m As Integer)As Boolean

‘本函数判断m是否是素数:是素数返问值为True,不是素数返回值为False

    ‘代码略

End Function

  1. (1) ⑴处加框代码应改为
  2. (2) ⑵处加框代码应改为
【加试题】有如下VB程序段:

i =1:j=2

Do While j <= 10

    If j < 10 Then

        If a(j) > a(j + 1)  Then j =  j + 1

    End If

    If a (i) > a(j)  Then

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

        i=j

        j=2*i

    Else

        Exit Do

    End If

Loop

Text1.Text =a (2)

已知数组元素a(1)到a(10)的原始数据为“20, 3, 10, 17,18, 15, 16, 19, 21, 30”,执行该代码后,文本框Text1中显示内容是:( )

A . 17 B . 20 C . 19 D . 3
合唱队列是按队员的身高进行排列,形成中间高两边有序降低的队形;例如有六个队员“己、戊、丁、丙、乙和甲”的身高依次由小到大,则排列后的顺序为“戊、丙、甲、乙、丁、己”。小李用VB编写模拟“合唱队列”程序,功能如下:在文本框Text1中输入各队员身高,输入结束并回车,则输入的各队员身高分别存入数组a中;单击“合唱队列”按钮Command1,对数组a的元素进行有序排列后,将各元素存入数组C中形成合唱队列,并将结果显示在文本框Text2中。程序运行界面如图所示:

实现上述功能的VB程序如下:

  1. (1) 如果输入各队员身高为“190,191,194,179,166”,则合唱队列的结果为
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Dim a(1 To 20) As Integer

    Dim n As Integer

    Private Sub Text1_KeyPress(KeyAscii As Integer)

    ‘将输入各队员身高分别存入数组a中,队员个数为n,代码略!

    End Sub

    Private Sub Command1_Click()

      Dim c(1 To 20) As Integer

      Dim right As Integer, left As Integer, i As Integer

      For i = 1 To n – 1          

        For j =1 To n-i

            If      ①      Then          

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

            End If

        Next j

    Next i

    ‘下列程序段实现数组C的合唱队列

    m = (1 + n) \ 2

    left = m: right = m

    c(m) = a(n)

    i = 2

    Do While i <= n

        If i Mod 2 = 0  Then

            right = right + 1

            c(right) = a(n-i+1)

        Else

                     ②      

            c(left) = a(n-i+1)

        End If

        i = i + 1

    Loop

    s =      ③     

    For i = 2 To n

        s = s + "," + Str(c(i))

    Next i

    Text2.Text = s

    End Sub

    以上程序段运行时,为了实现上述功能,划线处应填入的代码为:

    ; ②; ③

有如下VB程序段:

Dim a(1 To 5)As Integer, i As Integer, j As Integer key As Integer

a(1)=8:a(2)=13:a(3)=25:a(4)=98:a(5)=56

For i=4 To 5

j=i: Key a(j)

Do While a(j-1)>Key and j>

a(j)=a(j-1)

j=j-1

Loop

a(j)=Key

Next i

执行该程序段后,数组元素a(1)~a(5)的值是(  )

A . 98 56 25 13 8 B . 8 13 25 56 98 C . 56 25 13 8 98 D . 98 8 13 25 56
n个数据的冒泡升序排序需要经过n-1遍的加工,每一遍加工自下而上比较相邻两个数据,把较小者交换到上面,在第i遍加工过程中需要进行n-i对数据的比较。在某些情况下,第i遍加工过程中,在上面部分较小数据已经有序的情况下,不需要再进行n-i对数据的比较。如对“17, 18,19, 24, 23, 20”这6个数据排序中,第1遍排序结束后数据为“17, 18,19, 20, 24, 23”,第2遍排序时不再需要对20及其前面3个数据进行比较。以下程序实现了冒泡排序的优化,在横处填入合适的代码。

Dim n As Integer

Dim a(1 To 100) As Integer

’n=10,排序前生成的数据存储在数组a中,并在列表框List1中显示,代码略

Private Sub Command1_Click()

 Dim i As Integer, j As Integer, start As Integer, t As Integer

 i=2

 Do While i < n start=n

  For j=n To i Step-1

   IfThen

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

   

   End If

  Next j

  i=start+1

 Loop

 For i=1 To n

  List2.AddItem  

 Next i

End Sub

有以下VB程序段:

a(1)=6:a(2)=8:a(3)=7:a(4)=3:a(5)=1:a(6)=2:a(7)=5:a(8)=4

i = 1: j = 8

key = a(1)

Do While i < j

 Do While i < j And a(j) >= key

  j = j - 1

 Loop

 a(i) = a(j)

 Do While i < j And a(i) <= key

  i = i + 1

 Loop

 a(j) = a(i)

Loop

a(i) = key

For i = 1 To 8

 Label1.Caption=Label1.Caption++Str(a(i))

Next i

执行该程序段,标签Label1上显示的内容是(  )

A . 12345678 B . 876 C . 45231678 D . 451
小刘设计了一个排序算法,该排序算法会将数组a中奇数位的元素从小到大排列,偶数位的元素从大到小排列,程序界面如图,算法的VB程序段如下:

Private Sub Command2_Click()

Dim i As Integer, j As Integer, tmp As Integer

Dim s1 As String, t As Integer, s2 As String

t=1

For i=1 To n-2

    For j= To n Step 2     ‘改错

        If a(i)*t>a(j)*t Then

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

        End if

    Next j

                   ‘填空①

Next i

For i =1 To n

    If     Then       ‘填空②

        s1 =s1 Str(a(i))

    Else

        s2=s2+Str(a(i))

    End If

Text2. Text=“奇数位:”+s1

Text3. Text=“偶数位:”+s2

End Sub

回答以下问题:

  1. (1) 若要修改按钮 Command上显示的文字,应修改的属性名是(单选,填字母:A .Text/B .Caption/C .Click)
  2. (2) 程序代码中,For语句加框处有错,应改为.
  3. (3) 划线部分的代码应填①
  4. (4) 若将划线处“For i=1 To n-2”修改为“For i=1 To n-1”,是否会出错? (填是/否)
有如下VB程序段:

n = 8

For i = 1 To n

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

For i = 1 To n \ 2

If a(i) < a(i + 1) Then p = i: q = i + 1 Else p = i + 1: q = i For j = i + 2 To n - i + 1

If a(j) < a(p) Then q = p: p = j

ElseIf a(j) < a(q) Then q = j

End If Next j

If i <> p Then t = a(p): a(p) = a(i): a(i) = t

If i = q Then q = p

If n - i + 1 <> q Then t = a(q): a(q) = a(n - i + 1): a(n - i + 1) = t

 Next i

执行该程序段后,a(1)~a(8)各元素可能的值为(    )。

A . 1,2,4,6,7,8,9,10 B . 2,6,8,9,11,9,7,5 C . 10,8,6,5,3,6,7,9 D . 1,3,5,8,10,7,5,3
小明编写了一个有关整数闭区间合并操作的VB程序:从数据库读取闭区间数据(左端点和右端点),存储在数组a中,按区间数据左端点升序排序,然后进行合并操作,操作结果存储在数组b中。

例如,读取的数据为 2、3、15、25、10、14、1、5、30、60、15、25,过程是:

⑴设置区间信息为[2,3],[15,25],[10,14],[1,5],[30,60],[15,25];

⑵按区间左端点升序排序,得到J区间信息为

[1,5],[2,3],[10,14],[15,25],[15,25],[30,60],[15,25];

⑶合并区间,得到[1,5],[10,25],[30,60]。说明:区间[1,5]和[2,3]合并为[1,5],区间[10,14]和[15,25]合并为[10,25],区间[10,25]和[15,25]合并为[10,25],因此合并后的结果为:

[1,5],[10,25],[30,60]三个区间。

程序功能如下:单击“读数据库”按钮Command1,程序从数据库读取数据,输出在文本框Text1中;单击“开始处理”按钮Command2,程序进行区间排序,并进行区间合并操作,操作后的结果输出在文本框Text2中。程序运行结果如图所示。

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

  1. (1) Private Sub Command1_Click()中的Click()是(单选,填字母:A .对象名、B .属性名 、C .事件名、D .事件处理过程名)
  2. (2) 从数据库中读入的区间为[1,10],[15,20],[6,18],[25,30],[31,200],则合并操作后的区间为
  3. (3) 请在划线处填入合适的代码。

    Dim a(l To 100) As Integer ′数组a存储合并前的区间

    Dim b(l To 100) As Integer ′数组b存储合并后的区间

    Dim n As Integer    ′n表示区间个数

    Private Sub Command1_Click()

     Dim s1 As String, i As Integer

      ′读取数据,并存储到数组a中,并输出在文本框Text1中,代码略

    End Sub

    Private Sub Command2_CIick()

      Dim s2 As String, i As Integer, j As Integer, k As Integer

      Dim n As Integer, t As Integer, x As Integer

      For i=1 To n-1

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

       If  ① Then

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

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

       End If

     Next j

      Next i

      k=2

      b(1)=a(1): b(2)=a(2)

      i=2: j=3

      Do While j <=2 * n

        If b(i) >=a(j) Then

         If b(i) <=a(j+1) Then ② 

        Else If b(i)+1=a(j) Then

         b(k)=a(j+l)

        Else

         k=k+1:③

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

         i=i+2

        End If

         j=j+2

      Loop

      For x=1 To k-2 Step 2

        s2=s2 & “[”& b(x) & “,” & b(x+1) & “]” & “,”

      Next x

      s2=s2 & “[” & b(x) & “,” & b(x+1) & “]”

      Text2.text=s2

    End Sub

某次考试的流程为先笔试再面试,笔试成绩达到面试资格线的可以入围参加面试。入围面试的资格线根据计划录取人数的200%划定,即如果考试最终录取x人,则第2*x名选手的笔试分数为面试资格分数线(该分若有同分者可一同参加面试)。现在编写VB程序功能如下:自动读取数据库中考生考号和笔试成绩,依次存储在数组kh(i)、cj (i)中,并显示在Listl列表框中。

用户从Text1中输入计划人数,单击“入围划线”按钮Command1,面试分数线显示在文本框Text2 中,入围面试最终人数显示在 Text3中,进入面试考生的考号和笔试成绩显示在List2列表框中,如果成绩相同,则按考号从小到大的顺序显示。程序界面如图所示。

Dim kh(1 To 500) As String, cj(1 To 500) As Integer

Dim n As Integer ′参加考试总人数

Private Sub Form_Load()

Dim conn As New ADODB.Conncction

Dim rs As New ADODB.Recordset

conn.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;datasource=”+App.Path + ”\BSCJ.accdb”

conn.Open

Set rs.ActiveConnection = conn

rs.Open “select * FROM scoreinfo”

′本过程其他代码略

End Sub

Private Sub Commandl_click()

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

Dim t1 As Integer, t2 As String, flag As Boolean

For i = 1 To n - 1

  For j = 1 To

    If cj(i) < cj(j) Then

      t1 = cj(i): cj(i) = cj(j): cj(j) = t1

      t2 = kh(i): kh(i) = kh(j): kh(j) = t2

    EleIf      ①      Then

      t2 = kh(i): kh(i) = kh(j): kh(j) = t2

    End If

  Next j

Next i

m =     ②     

If m <= n Then

  i = m

  flag = Flase

  Do While i < n And Not flag
    If cj(i) = cj(i + 1) Then

      i = i + 1

 Else

             ③     

 End If
  Loop

  Text2.Text = Str(cj(m))

  Text3.Text = Str(i)

  For j = 1 To i

    List2.Addltem kh(j) + “ ” + Str(cj(j))

  Next j

Else

  Text2.Text = “面试人数超过了总人数”

End If

End Sub

  1. (1) 由代码可知,读取的数据库文件名为
  2. (2) 下面加框处代码有错误,请改正。
  3. (3) 请在划线处填入适当的代码。

     ② ③ 

下列VB程序段的功能为;根据文本框Text1中各字符的大小关系,计算各字符按升序排列的序号,并将序号保存在数组y中。如文本框内容为“2011”,程序运行后y(1)~y(4)各元素的值分别为“4,1,2,3”。

s=Text1.Text

n=Len(s)

For i=1 To n

    y(i)=1

Next i

For i=1 To

    For j=  To n

      If  Then

          y(j)=y(j)+1

      Else

          y(i)=y(i)+1

      End If

    Next j

Next i

上述程序段3个方框处的表达式分别为(  )

A . ⑴n         ⑵1         ⑶Mid(s,j,1)>=Mid(s,i,1) B . ⑴n         ⑵1         ⑶Mid(s,j,1)>Mid(s,i,1) C . ⑴n-1       ⑵i+1       ⑶Mid(s,j,1)>=Mid(s,i,1) D . ⑴n-1       ⑵i+1       ⑶Mid(s,j,1)>Mid(s,i,1)
某VB程序段如下

数组元素f(1)到f (8)赋初值为0,代码略

Key = Int(Rnd*7)*2+3

i =1:j=8:c=0

Key = Val(Text1.Text)

Do While i<=j

    m=(i+j)\ 2

    f(m) = 1

    If Key <= a(m) Then j =m-1 Else i=m+1

    For n=1 To 8

        c=c+f(n)

    Next n

数组元素a(1)到a(8)的值依次为“3,7,9,10,15,15,15,20”,执行该程序段后,则(    )

A . 变量j的值可能为8 B . 变量c的值一定为3 C . 变量i的值可能为9 D . a(j)的值可能等于key
学校需要从A班(共50人)选拔一批学生集训准备比赛。小明为了减轻老师的工作量,编写了一个程序帮助老师解决这个问题,将所有学生的成绩排序后按照预设人数划取分数线。由于相同分数可能有多个学生,找出最接近预设人数的分数作为分数线。如果按照前分和按后分录取增加或减少的人数相同时则按高于录取人数进行录取,最后输出录取的学生名单。例如现要求选拔15个学生,排序后第14-20名的学生成绩相同,由于13比20更接近预录取人数,因此实际只录取13人。小明编写的VB程序如下,在文本框Text1中输入拟录取人数,单击“确定”按钮后,在标签Labe15和Labe16中输出录取人数和分数线,在List1中输出录取学生名单。

实现上述功能的代码如下。请回答下列问题:

  1. (1) 观察代码,“确定”按钮的对象名是
  2. (2) 请在划线处填入合适的代码

    Dim xh(0 To 100) As String .

    Dim cj(0 To 100) As Integer

    Const num = 50

    Private Sub Form_ Load ()

    ‘本过程从数据库读取每位学生的学号和成绩存放在数组xh和cj中,代码略

    End Sub

    Private Sub Com1_Click ()

        Dim i As Integer, m As Integer, n As Integer, k As Integer, a As Integ

        a = Val(Text1.Text)

        For i=1 To num-1

            k=

            If k<>i Then

                t=cj(k):cj(k)=cj(i):cj(i)=t

                s=xh(k):xh(k)=xh(i):xh(i)=s

            End If

        Next i

        m=a-1:n=a+1

        Do While cj(m) = cj(a)

            m=m-1

        Loop

        Do While cj(n) = cj(a)

            n=n+1

        Loop

        If m<>0 And  Then lq = m Else lq=n-1

        Label5.Caption = Str(lq)

        Label6.Caption = Str(cj(lq))

        List1.AddItem “字号”+“学号”+“成绩”

        For i=1 To lq

           List1.AddItem Str(i) +“ ”+xh(i)+Str(cj(i))

        Next i

    End Sub

    Function imax(x As Integer, y As Integer) As Integer

        Dim i As Integer,j As Integer

        i=x

        For j=x+1 To y

            If  Then i=j

        Next j

        imax = i

    End Function

有一个数组采用冒泡排序,第1遍排序后的结果为:3,18,5,35,8,9,11,13,32,那么该数组的原始顺序不可能是(    )
A . 18,5,35,8,9,11,3,13,32 B . 3,18,5,35,13,11,32,8,9 C . 18,5,35,3,8,9,11,13,32 D . 18,5,35,8,9,11,13,32,3
火车调度台是实现火车车厢整理的平台,当相邻2节车厢序号不符合整理要求时,可以对调2节车厢,实现序号顺序调整。相邻2个进行符合目标的交换,和我们学习的冒泡排序思想一致,所以这个调度过程可以用冒泡排序实现。为了提高效率,对冒泡排序做了优化,请完善下列代码:

nums = [3, 1, 2, 4, 5, 6]

k = n - 1

for i in range(n - 1):

   

    for j in range(k):

        if (nums[j] > nums[j + 1]):

            nums[j], nums[j + 1] = nums[j + 1], nums[j]

           

            ex_flag = True

    if (ex_flag):

        break

print(nums)

小明利用所学的信息技术知识帮助语文老师设计一个语文学考等级查询系统,要求如下:输入某个等级,就能查出该等级的所有学生学号和姓名,并统计出该等级学生的人数,以便语文老师方便了解学生的学考情况。语文学考成绩分A、B、C、D、E五个等级,学生信息存储在数据库文件“stugrade.accdb”的数据表“Chinese”中,数据表“Chinese”的结构如图所示。

VB程序运行界面如图所示,在文本框Text1中输入查询的等级,单击“查询”按钮Command1,在列表框List1中显示所有该等级的学生学号和姓名,并按照学号从小到大排序,并在标签Label2 处显示学生的人数,如果人数为0,则在列表框中显示“没有该等级的学生”。按此要求编写程序如下,在划线处填上合适的代码。

Private Sub Command1_Click()

    Dim stuna(1 To 100) As String    '存放学生姓名的数组定义为stuna

    Dim stunum(1 To 100) As String    '存放学生学号的数组定义为stunum

    Dim i As Integer, j As Integer, n As Integer

    Dim t As String

    Dim cn As New ADODB. Connection

    '连接数据库

    Dim rs As New ADODB. Recordset

    Dim strSQL As String

    cn.ConnectionString =“Provider=Microsoft. ACE. OLEDB. 12. 0; Data Source=”+App. Path+“\stugrade. accdb”

    cn. Open

    strSQL=“select * from  where语文等级=‘ ”+Text1. Text+“’”

    Set rs. ActiveConnection= cn

    rs. Open strSQL

    n=0

    Do While Not rs. EOF   

        

        stuna(n)= rs. Fields(“姓名”). Value

        stunum(n)=rs. Fields(“学号”). Value

        rs. MoveNext

    Loop

    rs.Close

    cn.Close

    Set rs= Nothing

    Set cn= Nothing

        List1. Clear       '清除列表框

    If n=0 Then

        List1. AddItem“没有该等级的学生”

    Else

        For i=1 To n-1       '按学号排序

            For j=n To  Step - 1

                If  Then

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

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

                End If

            Next j

        Next i

        For i=1 To n

            List1. AddItem stunum(i)+“”+stuna(i)

        Next i

        Label2. Caption=“该等级的学生共有”+Str(n)+“名”

    End If

End Sub

有如下VB程序段:

Private Sub Command1_Click()

    Dim a(1 To 100) As String, x As String, st As String

    Dim i As Integer, j As Integer, n As Integer

    x = Text1.Text

    n = Len(Text1.Text)

    For i = 1 To n

        a(i) = Mid(x, i, 1)

    Next i

    For i = 1 To n - 1

        For j = n To i + 1 Step -1

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

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

            End If

        Next j

    Next i

    st = “ ”

    For i = 1 To n

        st = st + a(i)

    Next i

    Label1.Caption = st

End Sub

程序运行时,在文本框Text1中输入“Text”(不包含双引号),单击按钮Command1,则在标签Label1上显示的内容为(  )

A . Tetx B . Txte  C . xtTe D . xteT
有如下程序段:

For i=1 To 3

  For j=i+1 To 5

    If a(j) > a(i) And a(j)>60 Then

      t=a(j):a(j)=a(i):a(i)=t

    End If

  Next j

Next i

数组元素a(1)到a(5)的值依次为“33,16,68,45,77”,经过该程序段“加工”后,数组元素a(1)到a(5)的值依次是(     )

A . 77,68,16,45,33 B . 77,68,45,33,16 C . 77,68,33,45,16 D . 77,68,45,16,33
冒泡法是一种常用的排序方法,在排序时经常要进行数据的交换。下列四个选项中,(   )能正确地将x和y两个变量中的数据进行交换。
A . x=y  y=x  B . x=x+y  y=x-y  x=x-y C . m=x  x=y  y=m D . m=y  y=x  x=m