题型:综合题 题类:模拟题 难易度:困难
浙江大学附属中学2018届高三选考信息技术模拟考试试卷
对于一个轮转后有序数组arr也可以进行二分查找,算法思路如下(以升序为例):每次根据查找的左侧位置L和右侧位置 R 求出中间位置M后,M左边[L,M]和右边
[M+1,R]这两部分中至少一个是有序的(可根据中间位置数据和边界数据的大小关系判 断)。
arr[M]和待查找数据key比较
⑴arr[M]=key,返回M的值;
⑵若M位置右侧有序,当待查找数据在右侧,则下次在右侧查找,否则在M左侧查找。
⑶若M位置左侧有序,当待查找数据在左侧,则下次在左侧查找,否则在M右侧查找。
问题:
Function search(key As Integer, L As Integer, R As Integer) As Integer
Do While L <= R And search = -1
M = (L + R) \ 2
If arr(M) = key Then
search = M
Else
If Then
If arr(L) <= key And key < arr(M) Then
R = M - 1
Else
L = M + 1
End If
Else
If Then
L = M + 1
Else
R = M - 1
End If
End If
End If
Loop
End Function
a(1) |
a(2) |
a(3) |
…… |
a(n —2) |
a(n—1) |
a(n) |
3 |
25 |
38 |
…… |
55 |
31 |
12 |
依据对分查找思想,设计一个在数组a中查找数据key的程序。实现该功能的VB程序如下,但加框处代码有错,请改正。
Private Sub Command1_Click()
Const n = 6
Dim a(1 To n)As Integer,flag As Boolean
Dim i As Integer,j As Integer,m As Integer,key As Integer
'读取一组正整数,按上述规则存入数组a中,代码略。
key = VaKText1. Text)
i = 1
j = (n + 1) \ 2
flag = False
Do While And Not flag ‘①
m = (i + j) \ 2
If key = a(m) Then
flag = True
ElseIf key< a(m) Then
j = m - 1
Else
i = m + 1
End If
Loop
If Not flag And j > 0 Then
m = ‘②
If key = a(m) Then flag = True
End If
If flag Then
Text2. Text = Str(m)
Else
Text2. Text = "找不到"
End If
End Sub
①{#blank#}1{#/blank#} ②{#blank#}2{#/blank#}
试题篮