数据结构 二分法查找

/* 二分法查找 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
二分法查找是一种在有序数组中查找特定元素的搜索算法
二分法查找的时间复杂度O(logn)
*/

//递归算法
int recurbinary(int *a, int key, int low, int high)
{
    int mid;
    if (low > high)
    {
        return -1;
    }

    mid = low + (high - low) / 2;
    if (a[mid] == key)
    {
        return mid;
    }
    else if (a[mid] > key)
    {
        return recurbinary(a, key, low, mid - 1);
    }
    else
    {
        return recurbinary(a, key, mid + 1, high);
    }
        
}

//非递归算法
int binary(int *a, int key, int n)
{
    int left = 0, right = n - 1, mid = 0;

    mid = left + (right - left) / 2;
    while (left < right && a[mid] != key)
    {
        if (a[mid] < key) 
        {
            left = mid + 1;
        }
        else if (a[mid] > key)
        {
            right = mid;
        }
        mid = (left + right) / 2;
    }

    if (a[mid] == key)
    {
        return mid;
    }

    return -1;

}

int test()
{
    int a[] = { 1,2,3,4,5,6,7,8,9,12,13,45,67,89,99,101,111,123,134,565,677 };
    int b[] = { 677,1,7,11,67 };
    int i = 0;
    for (i = 0; i < sizeof(b) / sizeof(b[0]); i++)
    {
        printf("%d
", binary(a, b[i], sizeof(a) / sizeof(a[0])));
    }
    return 0;
}

int main()
{
    test();
    printf("-----ok------
");
    getchar();
    return 0;
}
原文地址:https://www.cnblogs.com/zhanggaofeng/p/10852810.html