1
排序查找专题练
1. 【五校联考】数组 a 存储 n 个学生的性别和身高数据,其中奇数位置存储性别,偶数位置存储身
高,数组的存储结构如下表所示:
该 n 位学生站成一排合影:男生全部在一侧,从低到高
排序:女生全部在另一侧,从高到低排(所有人的身高 h
为整数,且 100≤h≤200),排序前显示于 List1,排序后
显示 List2,如图所示。实现上述功能的 VB 程序如下,请
回答下列问题。
Const n=10
Dim a( 1 to 2 * n ) As String
Private Sub Form_Load( )
‘读取身高和性别数据,存储在数组 a中,并显示于列表框 List1中,代码略
End Sub
Private Sub Comd1_Click( )
Dim count As Integer, i As Integer, j As Integer
count = 0
For i = 1 To n - 1
start = 1
For j = n To i + 1 Step -1
If a(2 * j - 1) = "男" Then
If a(2 * j - 2) < a(2 * j) Then
t = a(2 * j - 2): a(2 * j - 2) = a(2 * j): a(2 * j) = t
t = a(2 * j - 3): a(2 * j - 3) = a(2 * j - 1): a(2 * j - 1) = t
start = j
End If
ElseIf a(2 * j - 3) = "女" Then
If Then
t = a(2 * j - 2): a(2 * j - 2) = a(2 * j): a(2 * j) = t
t = a(2 * j - 3): a(2 * j - 3) = a(2 * j - 1): a(2 * j - 1) = t
start = j
End If
End If
Next j
i = start - 1
count = count + 1
Next i
For i = 1 To n
List2.AddItem a(2 * i + 1) + a(2 * i)
Next i
End Sub
(1)程序代码中,加框处有错误,请改正。
(2)程序代码中,将下划线处语句补充完整。
2
(3)对于数据(男, 180, 女, 165, 男,170, 女,161, 男,176),程序运行后,变量 count 的值为 。
2.【之江第二次联考】数组 a 存储降序排列的 m 个数据,数组 b 中存储的是升序排列的 n 个
数据,且两个数 组中存储的数据为区间[1,20]范围内的不重复的随机整数。现将两个数组的数据合
并到 c 数组中,使 c 数组的数据为左右交替上升,如下表所示:
当窗体 Form1 加载时,自动产生 a、b 数组的数据,并分别显示在列表框 List1 与 List2 中,单
击合并按钮 Command1 后,在 c 数组中保存按规则合并后的 a、b 数组的数 据,并显示在列表框
List3 中。程序截图如 下所示:
实现该功能的 VB 程序如下:
Const m = 5
Const n = 6
Dim a(1 To m) As Integer
Dim b(1 To n) As Integer
Dim c(1 To m + n) As Integer
‘窗体加载时,生成数组 a、b 中的数据,并按要求排序后显示在列表框中,代码略
Private Sub Command1_Click()
Dim pa As Integer, pb As Integer, pc As Integer, s As Integer, flag As Boolean
pa = m: pb = 1: pc = 1
flag = True
Do While ① _
If a(pa) < b(pb) Then
s = a(pa)
pa = pa - 1
Else
s = b(pb)
pb = pb + 1
End If
c(pc) = s
If flag Then
pc = m + n - pc + 1
Else
pc = m + n – pc
End If
② _
Loop
‘处理 a、b 数组中剩余数据,并在列表框 List3 中输出数组 c,代码略
End Sub
(1)窗体加载的事件处理过程名为____。(填字母:A. Form1_Click / B. Form1_Load / C. Form_load)
(2)加框处代码有错,请改正。
3
(3)在划线处填入合适的代码。
3.【金华十校】小刘设计一个排序算法,该排序算法会将数组 a 中的奇数位的元素从小到大排列,
偶数位的元素从大到小排列,程序界面如图 15,算法的 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 = i + 1 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
Next i
text2.Text = "奇数位:" + s1
text3.Text = "偶数位:" + s2
End Sub
(1) 程序代码中,For 语句加框处有错,应改为: ▲ _
(2) 划线处的代码应填: ① ▲ ② ▲ _
(3) 若将划线处“For i=1 to n-2 ”修改为“For i=1 to n-1 ”是否会出错? ▲ (填是/否)
4. 【温州一模】数组 a 中存储的是两个数列交替排序的 n 个正整数,下标为奇数的数组元素都是
奇数且为升 序排列,下标为偶数的数组元素都是偶数且为降序排列。排序示例如下。
依据对分查找思想,设计一个在数组 a 中查找数据 key 的程序,实现该功能的 VB 程序如
下,请回答下列问题:
(1)观察程序代码,该事件处理过程名为 ▲ 。
(2)程序加框处代码有错,请改正。
(3)请在划线处填入合适的代码。
Private Sub Search_Click()
Const n = 10
Dim a(1 To n) As Integer
Dim i As Integer, j As Integer, m As Integer, f As Boolean, key As Integer
’读取一组正整数,按上述规则存入数组 a 中。代码略
key = Val(Text1.Text)
If key Mod 2 = 1 Then i = 1 Else i = 2
4
j = n :f = False
Do While i <= j And Not f
If key Mod 2 = 0 Then
m = (i + j) \ 2 - (i + j) \ 2 Mod 2
Else
m = ① _
End If
If key = a(m) Then
f = True
ElseIf key Mod 2 = 0 And key < a(m) Then
j = m - 2
Else
i = ② _
End If
Loop
If f Then Label1.Caption = Str(m) Else Label1.Caption = "不存在"
End Sub
5. 【浙南名校】小明学了排序和查找算法后,编写了一个处理成绩的程序。单击“获取成绩”按钮
得到 n 个非 降序数保存在数组 a(1)—a(n)中,并显示在 List1 中。在文本框 Text1 中输入成绩
key,单击“查 找”按钮,则在标签 label1 中显示共有多少位同学的成绩大于等于该成绩。
(1)加框 1 处的程序代码有错,应改为 。
(2)请在划线处填入合适代码:
Dim a(1000) As Integer, n As Integer
Private Sub Command1_Click()
'从数据库获取 n 个成绩存储在 a(1)-a(n)组中,代码略
For i = 2 To n ‘排序
tmp = a(i) :j = 1
Do While tmp >= a(j)
j = j + 1
If ① Then Exit Do
Loop
For k = i To j + 1 Step -1
a(k) = a(k - 1)
Next k
a(k-1) = tmp '改错 (1)
Next i
For i = 1 To n
List1.AddItem Str(a(i))
Next i
End Sub
Private Sub Command2_Click()
Dim key As Integer, i As Integer, j As Integer, m As Integer
key = Val(Text1.Text)
i = 1: j = n
Do While i <= j
5
m = (i + j) \ 2
Do While tmp >= a(j)
If ② Then
j = m - 1
Else
i = m + 1
End If
Loop
Label1.Caption = "共有" + ③ + "位同学大于等于该成绩。"
End Sub
6. 【名校协作体】数组 a 中存储了 n 个学生的学号和成绩数据,其中奇数位置存储学号信息,偶数
位置存储成绩信息,数组存储结构如第 15 题图 a 所示:
1 2 3 4 5 6 …… 2n-1 2n
学号 成绩 学号 成绩 学号 成绩 …… 学号 成绩
第 1个学生信息 第 2个学生信息 第 3 个学生信息 第 n个学生信息
第 15 题图 a 排序前数组 a存储结构
小迪同学使用选择排序思想对上述 n 个同学按成绩进行降序排序(成绩相同的按学号升序排
列),并依据成绩插入各位同学的名次信息,处理结束的数组 a存储结构如第 15 题图 b 所示。
1 2 3 4 5 6 7 8 9 …… 3n-2 3n-1 3n
名次 学号 成绩 名次 学号 成绩 名次 学号 成绩 …… 名次 学号 成绩
第 1个学生信息 第 2个学生信息 第 3 个学生信息 第 n 个学生信息
第 15 题图 b 排序排名后数组 a 存储结构
小迪同学使用 VB 编写了成绩处理程序,程序运行界面如第 15 题图 c所示:
第 15 题图 c
实现上述功能的 VB 程序如下,请回答下列问题。
Const n = 20
Dim a(1 To 3 * n) As Integer
6
Private Sub Command1_Click()
'读取数据,存储在数组 a 中,并显示在列表框 List1 中
'代码略
End Sub
Private Sub Command2_Click()
For i = n To 2 Step -1 '①改错
k = i
For j = 1 To i - 1
If a(2 * j) < a(2 * k) Or ② Then
k = j
End If
Next j
a(3 * i) = a(2 * k)
a(3 * i - 1) = a(2 * k - 1)
③
a(2 * k - 1) = a(2 * i - 1)
Next i
List2.AddItem "第 1 名: 学号" + CStr(a(2)) + ",分数" + Str(a(3))
a(1) = 1
mc = 1
For i = 2 To n
If ④ Then mc = i
List2.AddItem "第" + Str(mc) + "名: 学号"+ CStr(a(3*i-1))+",分数"+ Str(a(3*i))
a(3 * i - 2) = mc
Next i
End Sub
(1) 已知窗体名称为 Form1,要使程序加载时,窗体标题自动显示为“第 15 题程序”,则可在
_____________(单选,填字母)事件过程中添加代码:Form1.Caption= "第 15 题程序"。A.
Form_Click() B.Form_Load() C.Form1_Click() D.Form1_Load()
(2)程序加框处 For 循环语句有错,请改正。
(3)请将程序②③④划线处代码补充完整。
7.【台州一模】小王基于选择排序算法编写了一个 VB 程序,功能如下:读取若干数据一次存在数组
a 中,并将数据分段排序,每段数据的元素个数及排序的次序要求依次存储在数组 b 中。如图,在
文本框 Text1 中显示数组 a 的原始数据,在文本框 Text2 中显示每段数据的元素个数及排序次序要
求(0 表示升序,1 表示降序);单击“排序”按钮 Command1,根据要求输出对每段数据进行排序
的结果。实现上述功能的 VB 程序如下:
Dim n As Integer
Dim a(1 To 100) As Integer
Dim b(1 To 100) As Integer
Private Sub form_load()
’读取若干数据依次存储到数组 a中,并将数据元素的总个数存储到变量 n中;
’将每段数据的元素个数及排序的次序依次存储到数组 b中;
’b (1 )、b( 2 )分别存储第 1段数据的元素个数、排序的次序,
’b (3 )、b( 4 )分别存储第 2段数据的元素个数、排序的次序,……
End Sub
7
Private Sub Command1_Click()
Dim i As Integer, j As Integer, k As Integer, t As Integer
Dim pb As inetger, endpos As Integer
pb = 1: endpos = b(1)
For i = 1 To n - 1
If i = endpos Then
pb = pb + 2: i = endpos + 1
__________①____________
End If
k = i
For j = i + 1 To endpos
If a(j) < a(k) Then k = j ’(2)
Next j
If k <> i Then
___________②___________
End If
Next i
text3.Text = "" ’(4)
For i = 1 To n
text3.Text = text3.Text + Str(a(i))
Next i
End Sub
(1)程序加框处代码有错,请改正。
(2)为了实现上述功能,在划线处填写合适的代码。
(3)若程序运行时,读取了 100 个整数存储到数组 a 中,数组 b 各元素的值依次为“30,1,20,0,
40,0,10,1”,则程序运行到(4)处代码时,endpos 的值为 。
8.【嘉兴一模】编写 VB 程序,对地震观测点数据分析。程序运行时,点击“强震观测点>100”按钮
Command1,在左侧列表框 List1中输出强震观测点超过 100个的地区相关数据,并在标签 Label1中
输出满足条件的地区数;然后单击“排序”按钮 Command2,将列表框 List1中数据按“强震观测点”个
数降序排序,在右侧列表框 List2中输出排序结果,并在标签 Label2中输出强震观测点最多的地区。
程序运行界面如图所示。实现上述功能代码的 VB程序如下:
强震观测点数大于 100 的地区有 9 个
强震观测点数目最多的地区是云南
强震观测点 > 100 排序
8
Dim conn As NewADODB.Connect ‘定义一个 Connection对象实例
Dim rs As NewADODB.Recordset ‘创建 ADO 的 Recordset对象实例 rs
Dim dq(1 to 100) As String ‘dq数组用来保存地区名称
Dim qz(1 to 100) As Integer ‘qz数组用来保存强震观测点的数目
Dim dq2(1 to 100) As String ‘dq2数组用来保存强震观测点数大于 100的地区名称
Dim qz2(1 to 100) As String ‘qz2数组用来保存强震观测点大于 100地区的观测点数
Dim i As Integer, c As Integer
Private Sub Form_Load()
Conn,connectionString =” priovider=Microsoft.ACE.OLEDB.12.0:datasource=”&App.Path&” \地
震.accdb”
Conn.Open
Set rs.ActiveConnection = conn
rs.Open “select * from 源数据”
i = 0
Do While Not rs.EOF
i = i + 1
dq (i) = rs.Fields (“地区”)
qz (i) = ① _ ‘读取当前记录“强震观测点”字段的值赋给 qz(i)
rs.MoveNext
Loop
End Sub
Private Sub command1_click()
Dim j As integer
List1.Clear
c = 0
For j = 1 To i
If qz(j) > 100 Then
List1.additem dq(j) & ”强震观测点数目为:”& str(qz(j))& ”个”
c = c + 1
dq2(c) = dq(j)
qz2(c) = qz(j)
End If
Next j
Label1.Caption=”强震观测点大于 100的地区共有”& Str(c) & ”个”
End Sub
Private Sub command2_click()
Dim j As Integer,temp As Integer,mAs Integer
Dim temp2 As String
Dim Flag As Boolean
j = 1 : Flag=True
Do While ② _
Flag = False
For m = c To j + 1 Step -1
If dq2(m) < dq2(m+1) Then ‘加框处代码有误
temp = qz2(m): qz2(m) = qz2(m - 1): qz2(m - 1) = temp
9
temp2 = dq2(m): dq2(m) = dq2(m - 1): dq2(m - 1) = temp2
Flag = True
End If
Next m
j = j + 1
Loop
List2.Clear
For j = 1 To c
List2.AddItem dq2(j) & “强震观测点数目为:” & Str(qz2(j)) & ”个”
Next j
Label2.Caption = ” 强震观测点数目最多的地区是” & ③ _
End Sub
请回答以下问题:
(1)运行程序所需数据来自数据库文件“地震.accdb”中的数据表“源数据”(其部分界面如下图
所示),则 ① 处正确的代码为 。(单选:A. rs.Fileds(6) / B. rs.Fileds(7) )
ID 地区 监测总台数 国家级监测台 省级监测台 市县级监测台 强震观测点 单击以添加
(2)请在划线处②、③填入合适的代码。
(3)加框处代码有误,请改正。
9. 【9+1 联盟】有一数组 a具有 n(1≤n≤100)个元素,分别为 a(1)到 a(n),数组元素都为
正整数且有可能相等。对于每一个数组元素,如果它后面存在大于或等于该元素的数,则这两个数
可以组成一对。每个元素和自己也可以组成一对。例如:{3,7,2,4,8},可以组成 12 对,分别
为(数字为下标):(1,1),(1,2),(1,4),(1,5),(2,2),(2,5),(3,3),
(3,4),(3,5),(4,4),(4,5),(5,5).其中(1,5)是距离最远的一对,距离为 4。
小明编写了一个 VB 程序,用于计算 n 个数组元素的最远距离。具体功能如下:运行程序时,在列表
框 List1 中显示 n个数组元素,单击命令按钮 Command1,在文本框中显示这 n个数组元素的最远距
离。运行效果如图所示:
实现上述功能的 VB 代码如下:
Const n = 5
Dim a(1 To n) As Integer '用于记录每个数组元素的值
Dim b(1 To n) As Integer '用于记录每个数组元素在原数组中的下标
10
Private Sub Form_Load()
'读取一组正整数,存储在数组 a 中
'将每个数组元素在原数组中的下标存储在数组 b 中
'将数组元素显示在列表框 List1 中
'代码略
End Sub
Function Getans() As Integer
Dim left As Integer, ans As Integer
left = 10000: ans = 0
For i = 1 To n
If b(i) < left Then left = b(i)
If b(i) - left > ans Then ans = b(i) - left
Next i
Getans = ans
End Function
Private Sub Command1_Click()
Dim i As Integer, j As Integer, t As Integer
For i = 1 To n
For j = n To i + 1 Step -1
If a(j) <= a(j - 1) Then
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
Text1.Text = ___________________
End Sub
(1)请在划线处填入合适代码。
(2)加框处代码有误,请改正。
(3)如程序运行界面所示数据,单击命令按钮 Command1 后,数组元素 b(2)的值为 。
10. 【绍兴一模】数组 a 保存 n 个(n≤1000)区间的端点:数组元素 a(1)、a(2)保存第 1 个
区间左、右端点,a(3)、a(4)保存在第 2 个区间左、右端点,……。区间排序方法(以升序为
例):先按区间的左端点进行升序排序,当左端点相同时,再按右端点升序排序。示例:
[1,2],[3,5],[5,6],[3,4]升序排序后的结果为:[1,2],[3,4],[3,5],[5,6]。小沈
基于选择排序思想对 n个区间进行升序排序并进行了优化,VB 程序如下:
Dim a(1 To 2 * 1000) As Integer
'读取 n 个区间的左、右端点值存数组 a,代码略
Private Sub Cmd1_Click()
Dim i As Integer, j As Integer, p As Integer, q As Integer
Dim iMax As Integer, iMin As Integer
p = ① : q = n
Do While p < q
If IsLarger(p, p + 1) Then
iMax = p: iMin = p + 1
Else
11
iMax = p + 1: iMin = p
End If
'先对区间两两分组处理,如果剩余 1个区间再进行处理
For i = p + 3 To q Step 2
If ② Then
If IsLarger(i, iMax) Then iMax = i
If IsLarger(iMin, i - 1) Then iMin = i - 1
Else
If IsLarger(i - 1, iMax) Then iMax = i - 1
If IsLarger(iMin, i) Then iMin = i
End If
Next i
If n Mod 2 = 1 Then
If IsLarger(q, iMax) Then iMax = q
If IsLarger(iMin, q) Then iMin = q
End If
t = a(2 * iMin - 1): a(2 * iMin - 1) = a(2 * p - 1): a(2 * p - 1) = t
t = a(2 * iMin): a(2 * iMin) = a(2 * p): a(2 * p) = t
If iMax = p Then iMin = iMax
t = a(2 * iMax - 1): a(2 * iMax - 1) = a(2 * q - 1): a(2 * q - 1) = t
t = a(2 * iMax): a(2 * iMax) = a(2 * q): a(2 * q) = t
p = p + 1: q = q - 1
Loop
'输出排序结果,代码略
End Sub
'本函数判断 a 数组中第 i 区间是否大于第 j 区间,如果是则返回 True,否则返回 False
Function IsLarger(i As Integer, j As Integer) As Boolean
If a(2 * i - 1) > a(2 * j - 1) Or a(2 * i - 1)=a(2 * j - 1) And a(2 * i) > a(2 * j) Then
IsLarger = True
Else
IsLarger = False
End If
End Function
11.【2019.9 嘉兴期末】编写 VB 程序,实现在一个升序排列的数组中查找绝对值最小的元素。已
知数组元素由正整数、负整数或 0构成。例如:数组元素值为 [-9,-5,-3,-l,2,5,7,17],
该数组中绝对值最小的元素为-1。程序运行时,产生 n 个元素,在列表框 Listl 中显示,单击按
钮 Commandl,在标签 Label1 中输出绝对值最小的元素。运行结果如下图所示,实现上述功能的
VB 代码如下:
12
Const n = 15
Dim a(1 To n) As Integer
Private Sub Form_Load()
'产生 n 个由正整数、负整数或 0 构成的元素,存储在数组 a 中,并升序排列,代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, m As Integer, absmin As Integer
flag = False: i = 1: j = n
Do While i <= j
m = (i + j) \ 2
If a(m) = 0 Then
flag = True: absmin = a(m): Exit Do
ElseIf a(m) >= 0 Then
If ① Then
j = m - 1
Else
flag = True
absmin = dmin(a(m - 1), a(m))
End If
Else
If a(m + 1) < 0 Then
i = m + 1
Else
flag = True
②
End If
End If
Loop
Label1.Caption = "绝对值最小的元素是:" + Str(absmin)
End Sub
Function dmin(x As Integer, y As Integer) As Integer
If Abs(x) < Abs(y) Then dmin = x Else dmin = y
End Function
12. 【自编】编写一个 VB 程序,实现功能如下:将一组升序排列的数据“1,3,3,5,5,7,10,11,12,15”
Const n = 10
Dim a(1 To 10) As Integer
Private Sub Form_Load()
<
依次存储在数组 a 中,在文本框 Text1 中输入 k1,在文本框 Text2 中输入成绩 k2(k1
>k1 且<k2 的数据的起止位置。程序运行界面如图所示,请在划线处填入合适代码。
13
'将升序排列的数据存储到数组 a 中,代码略
End Sub
Private Sub Command1_Click()
Dim k1 As Integer, k2 As Integer, i As Integer, j As Integer, m As Integer
Dim t As Integer, L As Integer, R As Integer
k1 = Val(Text1.Text)
k2 = Val(Text2.Text)
If k1 > k2 Then t = k1: k1 = k2: k2 = t
'寻找起始位置
i = 0: j = ①
Do While i < j
m = (i + j + 1) \ 2
If k1 < a(m) Then
j = m - 1
Else
i = ②
End If
Loop
L = ③
'寻找结束位置
i = 0: j = n + 1
Do While i + 1 < j
m = (i + j) \ 2
If ④ Then
j = m
Else
i = m
End If
Loop
R = ⑤
Label3.Caption = ">" + Str(k1) + ",<" + Str(k2) + "的数据位置为:"
Text3.Text = Str(L) + " -" + Str(R)
End Sub
13. 【2019.11 杭州期中】对 k (k<=100)个数据进行排序时,可以利用一种排序方式进行处理,算
法如下: ①每次将第 i 个数据和第 2*i 以及第 2*i+1 个位置的数据进行比较,将较大值交换到
第 i 置上; ②从数组的第 i(未排序数据个数一半位置)个位置重复步骤①一直比较到最前面,这
样就可将最大值交换到第 1 个位置; . ③最终将 1 号位置上的值与未排序数据的最后一个进行交
换, 得到最大值; ④反复执行①②③三个步骤就可以将数据按升序排序 过程如下图所示,其中
a(1)=11, a(2)=25, a(3)=52, a(4)=39, a(5)=46, 开始比较的位置从 i=k\2 个位置开始;
14
第一次排序过程:
步骤①:
步骤②:
步骤③:
第二次排序过程:
现要求在文本框 Text1 中输入一个整数 k,对 k 个随机生成的两位奇数按上述排序方法进行排序,
代码和程序运行界面如下所示,请在划线处填入合适的代码,并且在加框处代码有错误,请改正:
Dim a(1 To 100) As Integer
Dim k As Integer
Private Sub Command1_Click()
Dim i As Integer
k = Val(Textl.Text)
Randomize
For i = 1 To k
a(i) = ①
List1.AddItem Str(a(i))
Next i
End Sub
Private Sub Cormand2_Click()
Dim i As Integer, j As Integer, t As Integer, flag As Integer
For i = 1 To k - 1
For j = k \ 2 To 1 Step -1
If Not judge(i, j) Then
If ② Then
t = a(j): a(j) = a(2 * j): a(2 * j) = t
Else
t = a(j): a() = a(2 * j + 1): a(2 * j + 1) = t
15
End If
End If
Next j
t = a(1): a(1) = a(k - i + 1): a(k - i + 1) = t
Next i
For i = 1 To k
List2.AddItem Str(a(i))
Next i
End Sub
Function judge(t As Integer, s As Integer) As Boolean
③ _
If a(s) > a(2 * s) And a(s) > a(2 * s + 1) Or a(s) > a(2 * s) And 2 * s > k - t Then
judge = True
End If
End Function
(1)如果现有数据 a(1)=27,a(2)=12,a(3)=33,a(4)=78,a(5)=61,完成一次排序之后 a(2)的值是 。
14. 【2018.9 宁波十校】小明编写了一个 VB 程序对成绩数据进行排序。为保证相同分数的同学相
对位置(指原数据中的前后关系)不发生改变,他试着采用一种新的排序算法来解决。为便于描述
算法的实现过程,假定有如下数组 a:
下标 1 2 3 4 5
值 5 3 3 2 4
第一步:统计数组 a 中每个值 a(i)出现的次数,存入 b(a(i)),统计完成后数组 b 的情况如下:
下标 1 2 3 4 5
值 0 1 2 1 1
第二步:从前向后,依次使数组 b 中的每个值等于其与前一项之和,这样数组 b(a(i))就代表了数
组 a 中小于或等于 a(i)的元素个数,完成第二步后数组 b 如下:
下标 1 2 3 4 5
值 0 1 3 4 5
第三步:从后往前,依次将数组 a 中元素填入数组 c 中,将数组元素 a(i)放在数组 c 的
第 b(a(i))项,如元素 a(1)=5,应该放在数组 c 的 b(5)位(即 c(5))。每放一个
元素就将 b(a(i))递减;完成第三步
后,数组 c 如下所示,已经完成升序
排序,且相对位置不变,即原来 a(2)
的值 3 仍然在 a(3)的值 3 前面。
下标 1 2 3 4 5
值 2 3 3 4 5
程序运行界面如右图所示:实现上述
功能的 VB 程序如下,回答以下问题:
(1)从代码中可以得知,用于连接数
据库的对象名是: 。
Dim a(1 To 50) As Integer '存放学生的成绩
Dim sname(1 To 50) As String '存放学生姓名
Dim n As Integer
Private Sub Command1_Click()
Dim conn As New ADODB.Connection
16
Dim rs As New ADODB.Recordset
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data"Source=" + App.Path +
"\stu.accdb"
conn.Open
strSQL = "SELECT * From stucj"
Set rs.ActiveConnection = conn
rs.Open strSQL
n = 0
List1.AddItem "姓 名" & " " & "成绩"
Do While Not rs.EOF
_________①_________
a(n) = rs.Fields("cj")
sname(n) = rs.Fields("xm")
List1.AddItem sname(n) & " " & Str(a(n))
rs.movenex
Loop
rs.Close
conn.Close
End Sub
Private Sub Command2_Click()
Dim i As Integer, k As Integer
Dim b(0 To 100) As Integer
Dim c(1 To 50) As Integer, c1(1 To 50) As String 'c 和 c1 作为临时数组
For i = 1 To n
b(a(i)) = b(a(i)) + 1
Next i
For i = 1 To 100
b(i) = ②
Next i
For i = n To 1 Step -1
c(b(a(i))) = a(i)
c1(b(a(i))) = sname(i)
_________③___________
Next i
For i = 1 To n '把临时数组 c 和 c1 中的数据放入 a 和 sname 数组
a(i) = c(i)
sname(i) = c1(i)
Next i
List2.AddItem "姓 名" & " " & "成绩"
For i = 1 To n
List2.AddItem sname(i) & " " & Str(a(i))
Next i
End Sub
17
参考答案:
1.(1)① start=n
② a(2 * j - 3) = "女" Or a(2 * j - 2) > a(2 * j) 或
a(2 * j - 3) < a(2 * j - 1) Or a(2 * j - 2) > a(2 * j)
a(2 * j - 3)<>a(2*j-1) Or a(2 * j - 2) > a(2 * j) 或其他等价答案
(2) a(2 * j - 2) < a(2 * j)
(3) 3
2. (1)C (2)m + n – pc + 2 (3)① pa >= 1 And pb <= n ② flag = Not flag
3. (1)i+2 (2)① t = - t ② i mod 2 = 1 (3)否
4. (1)Search_Click()
(2)key mod 2 = 0 and key > a(m) or key mod 2 = 1 and key < a(m)
(3)① (i+j) \ 2 - ((i+j) \ 2 + 1) mod 2 ② m+2
5. (1)a(k) = tmp (2)① j = i ② a(m)>=key ③ str(n-j) 或者 str(n-i+1)
6. (1) B
(2)① For i = n to 1 step -1 (1 分)
(3)② Or a(2 * j) = a(2 * k) And a(2 * j - 1) > a(2 * k - 1)
③ a(2*k)=a(2*i)
④ a(3 * i) < a(3 * i - 3)
7. (1) b(pb + 1) = 0 and a(j)a(k) 或
(-1) ^ b(bp + 1) * a(j) < (-1) ^ b(bp + 1) * a(k)
(2)① endpos = endpos + b(pb)
② t = a(k) : a(k) = a(i) : a(i) = t
(3)100
8. (1) A (2)② flag And j <= c - 1 ③ dq2(1) (3)qz2(m) > qz2(m - 1)
9. (1)Str(Getans()) (2)a(j) < a( j - 1) (3)1
10. (1)1 (2)IsLarger(i , i - 1) (3)iMax = iMin
11. (1)Not Flag 或 Not Flag and i <= j
(2)a(m - 1) > 0 或 a(m) * a(m - 1) > 0 或 a(m) + a(m - 1) > 0
(3)absmin = dmin(a(m),a(m + 1)) 或 absmin = dmin(a(m + 1),a(m))
12. ① n ② m ③ i + 1 或 j + 1 ④ k2 <= a(m) ⑤ i 或 j - 1
13. (1) 27
(2) (k-i+1)\2
(3) ① Int(Rnd * 45) * 2 + 11 等同答案即可
② 2 * j + 1> k – i + 1 Or a(2 * j) > a(2 * j + 1) 等同答案即可
③ judge = False
14. (1) conn (2) ① n=n+1 ② b(i)+b(i-1) ③ b(a(i))=b(a(i))-1