c语言二分查找的实现
admin
2023-02-20 02:20:06
0

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

通常在查找数组的时候,会发现一个一个查找很浪费资源,因此通过二分查找法实现 。

算法要求:

1.必须采用顺序存储结构。

2.必须按关键字大小有序排列。

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。


c语言二分查找的实现

(上面是思维导图)

#include
#include 
//while、do while 、goto、for、递归

void digui(int shang,int xia,int zhong,int num)
{
    zhong = (shang + xia) / 2;
    if (shang <= xia)
    {
        if (num == zhong)
        {
            printf("递归:find.%d\n", zhong);
            return;
        }
        else if (num < zhong)
        {
            xia = zhong - 1;
            printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);
        }
        else
        {
            shang = zhong + 1;
            printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);
        }

    }
    return;
}

int main()
{
    int a[1024];
    for (int i = 0; i<1024; i++) {
        a[i] = i;
        //printf("%d\n",a[i]);
    }
    int shang = 0;
    int xia = 1023;
    int zhong = (shang + xia) / 2;
    int num = 102;
    while (shang <= xia)//一、while
    {
        zhong = (shang + xia) / 2;
        if (num == zhong)
        {
            printf("while:find.%d\n", zhong);
            break;
        }
        else if (num < zhong)
        {
            xia = zhong - 1;
            printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);

        }
        else
        {
            shang = zhong + 1;
            printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);
        }

    }
    printf("==================\n");
    printf("==================\n");
    printf("==================\n");

    shang = 0;
    xia = 1023;
    zhong = (shang + xia) / 2;
    num = 102;
    do {//二、do while
        zhong = (shang + xia) / 2;
        if (num == zhong)
        {
            printf("do while:find.%d\n", zhong);
            break;
        }
        else if (num < zhong)
        {
            xia = zhong - 1;
            printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);
        }
        else
        {
            shang = zhong + 1;
            printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);
        }

    } while (xia>=shang);

    printf("==================\n");
    printf("==================\n");
    printf("==================\n");

    shang = 0;
    xia = 1023;
    zhong = (shang + xia) / 2;
    num = 988;
AAA://三、goto
    zhong = (xia + shang) / 2;
    if (num == zhong)
    {
        printf("goto:find.%d\n", zhong);
        goto BBB;
    }
    else if (num > zhong)
    {
        shang = zhong + 1;
        printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);
    }
    else
    {
        xia = zhong - 1;
        printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);
    }

    if (shang<=xia)
    {
        goto AAA;
    }
BBB:

    printf("==================\n");
    printf("==================\n");
    printf("==================\n");

    shang = 0;
    xia = 1023;
    zhong = (shang + xia) / 2;
    num = 288;
    for (int i; shang <= xia ;zhong = (shang + xia) / 2)
    {
        if (num == zhong)
        {
            printf("for:find.%d\n", zhong);
            break;
        }
        else if (num < zhong)
        {
            xia = zhong - 1;
            printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);
        }
        else
        {
            shang = zhong + 1;
            printf("shang.%d,zhong.%d,xia.%d \n", shang, zhong, xia);
        }
    }

    printf("==================\n");
    printf("==================\n");
    printf("==================\n");

    shang = 0;
    xia = 1023;
    zhong = (shang + xia) / 2;
    num = 288;

    digui(shang,xia,zhong,num); //递归

    getchar();
    getchar(); 
    Sleep(5000);

    return 0;
}

相关内容

热门资讯

今日重大通报“元来黄冈麻将.到... 家人们!今天小编来为大家解答元来黄冈麻将透视挂怎么安装这个问题咨询软件客服徽4282891的挂在哪里...
终于了解“闽游麻将拼多多.到底... 终于了解“闽游麻将拼多多.到底是不是挂?”透视曝光猫腻您好,闽游麻将拼多多这个游戏其实有挂的,确实是...
重磅消息“道游牛牛.是不是有挂... 您好:道游牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游戏...
终于明白“正版授权牛牛.真的有... 网上科普关于“正版授权牛牛有没有挂”话题很是火热,小编也是针对正版授权牛牛作*弊开挂的方法以及开挂对...
今日重大通报“新卡农炸金花.到... 网上科普关于“新卡农炸金花有没有挂”话题很是火热,小编也是针对新卡农炸金花作*弊开挂的方法以及开挂对...
今日重磅消息“八闽十三水.开挂... 您好:八闽十三水这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游...
玩家最新攻略“旺旺福建麻将.有... 网上科普关于“旺旺福建麻将有没有挂”话题很是火热,小编也是针对旺旺福建麻将作*弊开挂的方法以及开挂对...
今日重大消息“龙泰棋牌.辅助器... 您好:龙泰棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游戏...
终于懂了“微乐卡五星.是不是有... 有 亲,根据资深记者爆料微乐卡五星是可以开挂的,确实有挂(咨询软件无需打...
今日重磅消息“诸暨游戏.怎么装... 网上科普关于“诸暨游戏有没有挂”话题很是火热,小编也是针对诸暨游戏作*弊开挂的方法以及开挂对应的知识...