本帖最后由 爱疯 于 2015-10-28 16:31 编辑
二分查找(折半查找)
1)前提:有序数组。
2)思想:在当前查找区中,x是被查找的值;min是左端最小值下标;max是右端最大值下标;mid是两个端点之间中点下标。不断的判断:
如果x
如果x>arr(mid),则去右半部分[mid+1,max]继续找x ...,
如果x=arr(mid),则mid就是x的位置,程序结束。
如果min>max,则返回-1,表示找不到x,程序结束。
3)试题:在有序数组中插入一个元素,并保证该数组仍有序。求插入的位置?
回答:通过折半方式,查找该元素的位置。如果该元素已存在,就插入到该元素的位置;否则,插入到当前最小索引的位置。
'**************************************************************************************
'需求:在数组arr中查找x,有就返回下标,没有则返回-1。
Sub test()
Dim arr()
arr = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
MsgBox binarySearch2(arr, 3), , "下标"
End Sub
'**************************************************************************************
Function binarySearch1(arr, x) As Long
Dim min&, max&, mid&
min = LBound(arr)
max = UBound(arr)
mid = (min + max) / 2
Do While x <> arr(mid)
If x > arr(mid) Then min = mid + 1 Else max = mid - 1
If min > max Then mid = -1: Exit Do
mid = (min + max) / 2
Loop
binarySearch1 = mid
End Function
'**************************************************************************************
Function binarySearch2(arr, x) As Long
Dim min&, max&, mid&
binarySearch2 = -1
min = LBound(arr)
max = UBound(arr)
Do While min <= max
mid = (min + max) / 2
If x = arr(mid) Then binarySearch2 = mid: Exit Do
If x > arr(mid) Then min = mid + 1 Else max = mid - 1
Loop
End Function
'**************************************************************************************
二分查找_百度百科