• 折半查找(C语言)


    例如 :13  44  77  90 127 189 242  3549

    (1)定义一个变量key用于存放要查找的数字242

       key = 242

      (2) 定义变量low、mid和high分别存储数组的最小下标、中间下标和最大下标。并有:

      mid = (low+hight)/2 = (0 + 7)/2 = 3

    (3)此时a[3] = 90, 而key > 90,说明了242在90的右边,则往后查找:

        low = mid + 1 = 4

       (4)然后冲新重新定义mid

         mid = (4 + 7)/2  = 5

       (5)此时a[5] = 189, 而key > 189,说明242在189的右边,继续往后查找:

        low = mid + 1 = 6

       (6)然后重新更新mid:

       mid = (6 + 7) = 6 

       (7)此时a[6] = 242,找到了

      再找一下key = 77:

    (1)key = 77, mid = (low + high)/2 = (0+7)/2 = 3

      (2) 此时 a[3] = 90,而key < 90,说明了77在90的左边,则往前查找:

       high = mid -1 = 2

      (3)然后重新更新mid:

      mid = (0 + 2)/2 = 1

     (4) 此时a[1]  = 44,而key > 45,说明77在44的右边,则往后查找

      low = 1 + 1 = 2

    (5)然后更新mid

     mid = (2 + 2)/2 = 2

    (6)此时a[2] = 77 ,就找到了

    若所查找的数据在数组中没有的话,比如查找124

    (1)key = 123, mid = (low + high) /2 = (0 + 7) = 3

      (2) 此时a[3] = 90,key > 90 说明了124在90的右边,则往后查找:

       low  = mid + 1 = 4

       (3)然后重新更新mid

       mid = (4 + 7) = 5

      (4) 此时a[5] = 189,  key < 189 ,说明了124在189的左边,则往左边查找:

       (5) hight = mid - 1 = 4

       (6)此时low == high ,如果该数任不是要找的数的话,说明该序列中就没有该数了

    程序代码如下:

    /**
     * 二分查找
     * @return
     */
    #include 
    int main() {
        int a[] = {13, 44, 77, 90, 127, 189, 242, 3549};
        int key; //存放要查找的数
        int low = 0;
        int high = sizeof(a) / sizeof(a[0]);
        int mid;
        int flg = 0; //标志位,用于判断是否存在要找的数
        printf("请输入您要查找的数据:");
        scanf("%d", &key);
        while ((low <= high))
        {
            mid = (low + high) / 2;
            if(key < a[mid])
            {
                high = mid - 1;
            } else if (a[mid] < key)
            {
                low = mid + 1;
            } else
            {
                printf("下标 = %d\n", mid);
                flg = 1;
                break;
            }
        }
        if (flg == 0)
        {
            printf("sorry, data is not found \n");
        }
        return 0;
    }
    
  • 相关阅读:
    3.3日学习打卡----初学Redis(一)
    从 Language Model 到 Chat Application:对话接口的设计与实现
    金仓数据库 KingbaseGIS 使用手册(7. 栅格数据管理,查询和应用)
    基于springboot的社区团购系统设计与实现
    交互式 .Net 容器版
    基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.5版已发布
    Linux Troubleshooting 超实用系列 - Disk Analysis
    关于 java 的动态绑定机制
    关于复杂数据的处理
    Mybatis02动态sql和分页
  • 原文地址:https://blog.csdn.net/qq_37270243/article/details/128107507