C:折半查找法(二分法)

  主要用于已经做了排序的数字,时间复杂度:log2n

  直接贴代码

#include <stdio.h>
#include <stdlib.h>

int search(int search_num, int a[], int right)
{
    int left = 0;
    int ret = -1;
    int mid;

    while(right > left)
    {
        mid = (right + left) / 2;
        if (a[mid] == search_num)
        {
            ret = mid;
            break;
        }
        else if (a[mid] > search_num)
        {
            right = mid - 1;
        }
        else
        {
            left = mid + 1;
        }
    }
    return ret;
}

int a[9] = {1, 3, 5, 6, 8, 10, 12, 15, 17};
int main()
{
    /*二分法搜索方法
    思路:
        1.设置左标和右标,建立search函数做二分运算
        2.函数建立
            循环终止条件是当right > left
            mid由(right + left) / 2得到
            if
                mid = 所求;   break
            if else
                mid > 所求;   left = mid + 1
            else
                mid < 所求    right = mid - 1

            1, 3, 5, 6, 8, 10, 12, 15, 17
            搜索3
            left 0 right 8  mid 4   a[mid] 8 > 3    right = mid - 1





    */
    int left = 0, len, ret;
    int search_num;
    scanf("%d",&search_num);
    len = sizeof(a) / sizeof(a[1]);
    ret = search(search_num, a, len-1);
    if (ret == -1)
    {
        printf("数组中没有该值");
    }
    else
    {
        printf("%d在数组的第%d个位置",search_num,ret+1);
    }
}

  核心思路

/*二分法搜索方法
    思路:
        1.设置左标和右标,建立search函数做二分运算
        2.函数建立
            循环终止条件是当right > left
            mid由(right + left) / 2得到

    设置ret作为返回函数的值,如果ret为-1则查找失败,否则返回数组下标
            if
                mid = 所求;   break
            if else
                mid > 所求;   left = mid + 1
            else
                mid < 所求    right = mid - 1

            1, 3, 5, 6, 8, 10, 12, 15, 17
            搜索3
            left 0 right 8  mid 4   a[mid] 8 > 3    right = mid - 1
    */

    

   期间犯的错误:

      1.低级错误,scanf("请输入查找的值:%d",search_num)

        如果要有其他输出,用printf输出

      2. right与left需要做-1 +1操作

      3. 区分len长度与right的关系,len是数组长度,right是右边下标,right = len - 1

      4. 数组传参的时候,函数中只要 search(a),传入数组名即可,函数search(int a[])中[]不能省略,并且记得表明数据类型

        

猜你喜欢

转载自www.cnblogs.com/zhaoy-shine/p/10833324.html