仕様
前回はバイナリーサーチの2回目の検索を行いました(前回の記事)。今回は3回目の検索、つまり以下資料の3を行います。



以下CとVBAのコードを記載します。
コード
#include <stdio.h>
#define NUM 100
int main()
{
int arr[NUM];
int val=42; //探したい値
int center; //中央要素
int head=0; //先頭要素
int tail=NUM-1; //末端要素
//配列に値を格納
for(int i=0;i<NUM;i++)
arr[i]=i+1;
//1回目
center=(tail-head)/2; //真ん中の要素数を計算
printf("%s%d\n","1 time:center=",center);
if(arr[center]==val) //値をみつけた時
printf("%s\n","true");
else if(val<arr[center]) //値が前半グループにある時
tail=center-1; //配列末尾の要素数変更
else //値が後半グループにある時
head=center+1; //配列先頭の要素数変更
//2回目
center=(tail-head)/2; //真ん中の要素数を計算
printf("%s%d\n","2 time:center=",center);
if(arr[center]==val) //値をみつけた時
printf("%s\n","true");
else if(val<arr[center]) //値が前半グループにある時
tail=center-1; //配列末尾の要素数変更
else //値が後半グループにある時
head=center+1; //配列先頭の要素数変更
//3回目
center=head+(tail-head)/2; //真ん中の要素数を計算
printf("%s%d\n","3 time:center=",center);
if(arr[center]==val) //値をみつけた時
printf("%s\n","true");
else if(val<arr[center]) //値が前半グループにある時
tail=center-1; //配列末尾の要素数変更
else //値が後半グループにある時
head=center+1; //配列先頭の要素数変更
return 0;
}
Option Explicit
Const NUM As Integer = 99
Sub searchBinary()
Dim arr(NUM) As Integer
Dim val As Integer: val = 42 '探したい値
Dim center As Integer
Dim head As Integer: head = 0 '先頭要素
Dim tail As Integer: tail = NUM '末端要素
Dim i As Integer
'配列格納ループ
For i = 0 To NUM
arr(i) = i + 1
Next i
'1回目
center = Int((tail - head) / 2) '真ん中の要素数を計算(Int関数で小数点切り捨て)
Debug.Print "1 time:center=" + CStr(center) '値が前半グループにある時
If (arr(center) = val) Then '値をみつけた時
Debug.Print "true"
ElseIf (val < arr(center)) Then
tail = center - 1 '配列末尾の要素数変更
Else
head = center + 1 '配列先頭の要素数変更
End If
'2回目
center = Int((tail - head) / 2) '真ん中の要素数を計算(Int関数で小数点切り捨て)
Debug.Print "2 time:center=" + CStr(center) '値が前半グループにある時
If (arr(center) = val) Then '値をみつけた時
Debug.Print "true"
ElseIf (val < arr(center)) Then
tail = center - 1 '配列末尾の要素数変更
Else
head = center + 1 '配列先頭の要素数変更
End If
'3回目
center = Int(head + (tail - head) / 2) '真ん中の要素数を計算(Int関数で小数点切り捨て)
Debug.Print "3 time:center=" + CStr(center) '値が前半グループにある時
If (arr(center) = val) Then '値をみつけた時
Debug.Print "true"
ElseIf (val < arr(center)) Then
tail = center - 1 '配列末尾の要素数変更
Else
head = center + 1 '配列先頭の要素数変更
End If
End Sub
3回目の検索のコードを見ると1,2回目のコードとよく似ています。違うのはcenterを求める式だけですがこの式もよく似ています。この様な場合、ループを作れるか検討することをお勧めします。ループ化する事でコードを書く時間の短縮と可読性が良くなる、つまり見やすくなります。ということで次回、ループ化します。