• 二分法


    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int paixu(int *a);
    int chazhao(int *a,int b);
    
    
    int main()
    {
        int a[10] = { 2, 56, 58, 685, 459, 32, 1, 52, 68, 45 };
        paixu(a);
        int xiabiao = 0;
        xiabiao = chazhao(a, 685);
        printf("%d
    ", xiabiao);
        return 0;
    }
    
    int paixu(int *a)
    {
        int len = sizeof(a);
        for (int i = 0; i < len; i++)
        {
            for (int j = 0; j < len - 1; j++)
            {
                if (a[j] < a[j + 1])
                {
                    int tmp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = tmp;
                }
            }
        }
    }
    
    int chazhao(int *a, int b)    //b为想查找的数据
    {
        //下标
        int xiabiao = 0;
        //区域下限
        int low = 0;
        //区域上限 初次上限取为数组的最大宽度
        int high = sizeof(a);
        //二分法取得中间值
        int middle;
    
        while (high > low)
        {
            //一开始中间值为数组的中间
            middle = (low + high) / 2;
            //判断直到当b等于中间值时 输出中间值的下标
            if (b == a[middle])
            {
                return middle;
            }
            //进行循环时 如果b小于中间值 则更改上限,把刚才的中间值变为上限
            if (b < a[middle])
            {
                high = middle-1;
            }
            //如果b>中间值,则更改下限
            if (b >a[middle])
            {
                low = middle+1;
            }
        }
    }

    思路:

      取数组的首位下标作为上下限

      取其中间值作为基准

      用待查找值和中间值所对应的数字对比

      如果不相等,则判断大小,并且重新划分区域

      循环更改上下限重复查找

    #include <stdio.h>#include <string.h>#include <stdlib.h>int paixu(int *a);int chazhao(int *a,int b);

    int main(){int a[10] = { 2, 56, 58, 685, 459, 32, 1, 52, 68, 45 };paixu(a);int xiabiao = 0;xiabiao = chazhao(a, 685);printf("%d ", xiabiao);return 0;}
    int paixu(int *a){int len = sizeof(a);for (int i = 0; i < len; i++){for (int j = 0; j < len - 1; j++){if (a[j] < a[j + 1]){int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;}}}}
    int chazhao(int *a, int b)//b为想查找的数据{//下标int xiabiao = 0;//区域下限int low = 0;//区域上限 初次上限取为数组的最大宽度int high = sizeof(a);//二分法取得中间值int middle;
    while (high > low){//一开始中间值为数组的中间middle = (low + high) / 2;//判断直到当b等于中间值时 输出中间值的下标if (b == a[middle]){return middle;}//进行循环时 如果b小于中间值 则更改上限,把刚才的中间值变为上限if (b < a[middle]){high = middle-1;}//如果b>中间值,则更改下限if (b >a[middle]){low = middle+1;}}}

  • 相关阅读:
    Docker学习重点(5)~Docker镜像原理、commit提交镜像
    Docker学习重点(6)~容器数据卷
    Linux安装RocketMQ
    4.1 打包和压缩的概念和区别
    4.3 Linux压缩文件或目录为.zip格式(zip命令)
    3.21 Linux PATH环境变量及作用(初学者必读)
    4.6 Linux解压.gz格式的文件(gunzip命令)
    4.4 Linux解压.zip格式的文件(unzip命令)
    3.18 Linux懒人神器:命令自动补全功能!
    4.5 Linux压缩文件或目录中文件为.gz格式(gzip命令)
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/11868212.html
Copyright © 2020-2023  润新知