二分查找法-指针和数组表示-优化效率

二分查找法
一次截取一半的简单算法,学过数据结构应该都会.
主要思想:找到有序数组元素的中间元素,比较要查找的元素与中间元素
的大小进而确定新的上下界,就是二分法求解方程近视解相同
这种方法适合于已经排好顺序的数组,切记!
代码:

#include <stdio.h>
#include <stdlib.h>
#define N 1000
int *bsearch_1(int *p, int n, int num)
{//本算法用于查找有序数组p中的元素num, 采用二分查找法, 并用指针和移位运算来提高查找的效率
    int *low = p;
    int *high = p + n;
    int *mid = NULL;
    while (low < high)
    {
        mid = low + ((high - low) >> 1);//获取中间元素的位置
        if (num < *mid)
        {
            high = mid;//使用数组的不对称边界的思想,不包含上界
        }
        else if (num > *mid)
        {
            low = mid + 1;//使用数组的不对称边界的思想, 包含下界
        }
        else
        {
            return mid;
        } 
    }
    return NULL;
}

int *bsearch_2(int *p, int n, int num)
{//本算法用于查找有序数组p中的元素num, 采用二分查找法, 使用数组来表示, 效率没有bsearch_1高
    int low = 0;
    int high = n;
    int mid = 0;
    while (low < high)
    {
        mid = (high + low) / 2;
        if (num < p[mid])
        {
            high = mid;//使用数组的不对称边界的思想,不包含上界
        }
        else if (num > p[mid])
        {
            low = mid + 1; //使用数组的不对称边界的思想, 包含下界
        }
        else
        {
            return p + mid;
        }
    } 
    return NULL;
}

int main(void)
{
    int a[N];
    for (int i = 0; i < N; i++)//初始化有序的数组
    {
        a[i] = i + 1;
    }
    int *p = NULL;
    p = bsearch_1(a, N, 30);//测试bsearch_1
    if (p)
    {
        printf("bsearch_1:*p = %d\n", *p);
    } 

    p = bsearch_2(a, N, 30);//测试bsearch_2
    if (p)
    {
        printf("bsearch_2:*p = %d\n", *p);
    }
    system("pause");
    return 0;
}

自己需要上机单步调试,才能更好理解思想.

你可能感兴趣的:(c,二分查找,算法,不对称边界)