バイナリーサーチ3 探索3回目


仕様

 前回はバイナリーサーチの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を求める式だけですがこの式もよく似ています。この様な場合、ループを作れるか検討することをお勧めします。ループ化する事でコードを書く時間の短縮と可読性が良くなる、つまり見やすくなります。ということで次回、ループ化します。


コメントを残す