C语言----二分查找

二分查找

实例说明:

        本实例采用二分查找法查找特定关键字的元素。要求用户输入数组长度,也就是有序表的数据长度,并输入数组元素和查找的关键字。程序输出查找成功与否,以及成功时关键字在数组中的位置。例如,在有序表11、13、18、28、39、56、69、89、98、122中查找关键字为89的元素。

实现过程:

        1. 在编译环境下创建一个C文件。

        2. 引用头文件,代码如下:#include <stdio.h>

        3.自定义函数binary_search(),实现二分查找,代码如下:

void binary_search(int key,int a[],int n){      //自定义函数binary_search()
    int low,high,mid,count = 0,count1 = 0;
    low = 0;
    high = n - 1;
    while (low < high)                        //当查找范围不为0时执行循环体语句
    {
        count++;                              //count记录查找次数
        mid = (low + high) / 2;              //求中间位置
        if(key < a[mid])					//key小于中间值时 
            low = mid - 1;					//确定左子表范围 
        else if(key > a[mid])				//key大于中间值时 
            low = mid + 1;					//确定右子表范围 
        else if (key == a[mid])				//当key等于中间值时,证明查找成功 
        {
        	//输出查找次数及所查找元素在数组中的位置 
            printf("查找成功!\n查找 %d 次!a[%d]=%d",count,mid,key);
            count1++;						//count1记录查找成功次数 
            break;
        }
    }
    if (count1 == 0)						//判断是否查找失败 
        printf("查找失败!\n");				//查找失败输出no found 
}

        4. main()函数作为程序的入口函数,代码如下:

int main(int argc, char const *argv[])
{
    int i,key,a[100],n;
    printf("请输入数组的长度:");
    scanf("%d",&n);                     //输入数组元素个数
    printf("请输入数组元素:");
    for ( i = 0; i < n; i++)
        scanf("%d",&a[i]);              //输入有序数列到数组a中
    printf("请输入你要查找的元素:");
    scanf("%d",&key);                   //输入要查找的关键字
    binary_search(key,a,n);             //调用自定义函数
    printf("\n");
    return 0;
}

完整代码展示:

#include <stdio.h>

void binary_search(int key,int a[],int n){      //自定义函数binary_search()
    int low,high,mid,count = 0,count1 = 0;
    low = 0;
    high = n - 1;
    while (low < high)
    {
        count++;
        mid = (low + high) / 2;
        if(key < a[mid])
            low = mid - 1;
        else if(key > a[mid])
            low = mid + 1;
        else if (key == a[mid])
        {
            printf("查找成功!\n查找 %d 次! a[%d]=%d",count,mid,key);
            count1++;
            break;
        }
    }
    if (count1 == 0)
        printf("查找失败!\n");
}
int main(int argc, char const *argv[])
{
    int i,key,a[100],n;
    printf("请输入数组的长度:");
    scanf("%d",&n);                     //输入数组元素个数
    printf("请输入数组元素:");
    for ( i = 0; i < n; i++)
        scanf("%d",&a[i]);              //输入有序数列到数组a中
    printf("请输入你要查找的元素:");
    scanf("%d",&key);                   //输入要查找的关键字
    binary_search(key,a,n);             //调用自定义函数
    printf("\n");
    return 0;
}

 运行结果展示:

 技术要点:

        二分查找就是折半查找,其基本思想是:首先选取表中间位置的记录,将其关键字与给定关键字 key 进行比较,若相等,则查找成功;若key值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半查找;若key值比该关键字值小,则要找的元素一定在左子表中,继续对左子表进行折半查找。如此递推,直到查找成功或查找失败(查找范围为0)。

        希望能对您的学习和工作有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值