C语言折半查找法的超详细讲解

 更新时间:2022年06月17日 09:57:23   作者:一个爱好编程的大学生i  
折半查找法也叫做⼆分查找,顾名思义就是把数据分成两半,再判断所查找的key在哪⼀半中,再重复上述步骤知道找到⽬标key,下面这篇文章主要给大家介绍了关于C语言折半查找法的相关资料,需要的朋友可以参考下

折半查找法仅适用于对已有顺序的数组、数据进行操作!!!(从小到大)自我总结:折半查找法就是相当于(通过改变low或high的大小)把中间位置指到了key那个数那里,所以mid应该处于循环里面,即mid=(high+low)/2。注意:low,mid,high都要与下标绑定,也就是说它们就是下标。且循环条件是:high>=low.

同时注意:⑴若原来数组是由小到大排列的则:

      mid=(high+low)/2;
            if(key<a[mid])//说明要找的值在左边
            high=mid-1;
            else if(key>a[mid])//说明要找的值在mid右边
            low=mid+1;//最小值的位置往右进一位

㈡若原来数组是由大到小排列的则:

mid=(high+low)/2;
            if(key>a[mid])//注意是由大到小排列 ,所以此时key在a【mid】 左边,故high=mid-1 ;
            high=mid-1;
            else if(key<a[mid])//注意是由大到小排列,所以此时key在a【mid】右边,故low=mid+1;
            low=mid+1;

当然在下面这个代码中,也可以用选择排序法和冒泡法来对任意数组进行排序,然后在应用此函数,保证折半查找法的前提是排好序了。

#include<stdio.h>
 void zb(int key,int a[],int n)//key表示要找的数,a表示数组,n表示数组元素个数 
 {
     int i,high,low,mid;
     int count1=0,count=0;
     low=0;
     high=n-1;
     while(high>=low)//保证右下标不小于左下标 
     {    
        count++;
        mid=(high+low)/2;//总的来说变得是中间位置相当于把中间位置移到了key那个数那里,所以mid应该处于循环里面 
         if(key<a[mid])//说明key在a【mid】的左半边 ,那么最右边的high下标就可以在下标mid基础上往左进一个单位了
        high=mid-1;
         else if(key>a[mid])//说明key在a【mid】的右半边 ,那么最左边的low下标就可以在下标mid基础上往右进一个单位了 
         low=mid+1;
        if(key==a[mid])
        {
            printf("元素找到了!!!\n一共查找了%d次\n它处于a[%d]位置上\na[%d]=%d\n",count,mid,mid,key);
            count1++;
            break;
        }
    }
     if(count1==0)
     printf("元素不存在!!!\n");
 }
 int main ()
 {
     int key,n,a[100];
     int i;
     void zb(int key,int a[],int n);//声明定义函数 
     printf("请输入数组元素个数:\n");
     scanf("%d",&n);
     printf("请输入(从小到大)所有数组元素:\n");
     for(i=0;i<n;i++)
     {
         scanf("%d",&a[i]);
     }
     printf("请输入要查找的数:\n");
     scanf("%d",&key);
     zb(key,a,n);
     printf("\n");
     return 0;
 }

总结

到此这篇关于C语言折半查找法的文章就介绍到这了,更多相关C语言折半查找法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解结构体中占位符的用法

    深入理解结构体中占位符的用法

    本篇文章是对结构体中占位符的用法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言中的直接插入排序(带图详细)

    C语言中的直接插入排序(带图详细)

    这篇文章主要介绍了C语言中的直接插入排序(带图详细),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 使用C语言如何输出逆序数

    使用C语言如何输出逆序数

    逆序数的就是把一个数倒过来,例如:1234那么它的逆序数就为4321,我们该如何是实现呢?下面这篇文章主要给大家介绍了关于使用C语言如何输出逆序数的相关资料,需要的朋友可以参考下
    2022-01-01
  • C语言 结构体(Struct)详解及示例代码

    C语言 结构体(Struct)详解及示例代码

    本文主要介绍C语言 结构体的知识,学习C语言肯定需要学习结构体,这里详细说明了结构体并附示例代码,供大家参考学习,有需要的小伙伴可以参考下
    2016-08-08
  • QT UDP网络编程实现简单消息传输

    QT UDP网络编程实现简单消息传输

    这篇文章主要为大家详细介绍了QT UDP网络编程实现简单消息传输,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++分析讲解类的静态成员变量是什么

    C++分析讲解类的静态成员变量是什么

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存
    2022-04-04
  • C语言实现日期和时间处理的常用函数总结

    C语言实现日期和时间处理的常用函数总结

    在C语言中,时间和日期处理是一项非常基础的技能,也是开发实际应用程序时经常会用到的功能,本文为大家总结了C语言中一些常用的时间库函数,希望对大家有所帮助
    2023-06-06
  • OpenGL实现3D空间中移动图像

    OpenGL实现3D空间中移动图像

    这篇文章主要为大家详细介绍了OpenGL实现3D空间中移动图像,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • 可能是你看过最全的十大排序算法详解(完整版代码)

    可能是你看过最全的十大排序算法详解(完整版代码)

    排序算法是程序中常用的算法,下面这篇文章主要给大家介绍了关于十大排序算法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • C++印刷模板使用方法详解

    C++印刷模板使用方法详解

    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型
    2022-11-11

最新评论